在Keil MDK中无法使用gmtime函数进行时间戳转换
硬件平台STM32,软件平台Keil MDK 5.18
由于项目中需要用到UNIX时间戳和日历的来回转换,于是想到C库函数<time.h>里面有现成的函数可以使用。
于直接使用mktime和gmtime两个函数进行时间戳转换,前者把日历转为时间戳,后者把时间戳转为日历。
但是程序运行起来发现,gmtime得到的日历数据为乱码!!!
经过调试才发现,这个函数返回值是NULL啊!!!
查看反汇编代码,简直惊呆,这是什么鬼操作?
汇编代码没有函数跳转,取而代之的是MOVS R0, #0x00,直接返回0。
看到这一幕,气炸,搞了个假的库函数给我啊。
于是马上又换成另一个时间戳转转函数localtime,经测试发现这个函数工作得很好!
gmtime和localtime的区别就是,gmtime返回的是GMT标准时间,而localtime返回的是本地时间。
何为本地时间?那就是带时区转换的时间,比如北京时间是东8区,与GMT时间相差8小时。
然而MDK库函数并没有直接设置时区的函数,因此locatime返回的仍然是GMT时间。
所以在使时localtime的时候,要先把时间戳加上28800秒(8小时)再进行转换,就能得到北京时间。
最后附上日历和时间戳相互转换的代码:
日历转时间戳
日历转时间戳使用mktime函数,参考代码如下:
void date_to_timestamp(struct date *date, uint32_t *timestamp)
{time_t times;struct tm tm;tm.tm_year = date->year - 1900; //C库函数的年份是从1900开始计算tm.tm_mon = date->month - 1; //C库函数的月份是用0表示1月tm.tm_mday = date->day;tm.tm_hour = date->hour;tm.tm_min = date->minute;tm.tm_sec = date->second;times = mktime(&tm);*timestamp = times - 28800; //北京时间:东8区偏移值
}
时间戳转日历
时间戳转日历使用localtime函数,参考代码如下:
void timestamp_to_date(uint32_t timestamp, struct date *date)
{time_t times;struct tm *tm;times = timestamp + 28800;tm = localtime(×);date->year = tm->tm_year + 1900;date->month = tm->tm_mon + 1;date->day = tm->tm_mday;date->hour = tm->tm_hour;date->minute = tm->tm_min;date->second = tm->tm_sec;
}
PS:如果需要使用毫秒级的时间戳,可以直接把这个秒级的时间戳乘以1000,倒过来则除以1000。
在Keil MDK中无法使用gmtime函数进行时间戳转换相关推荐
- keil(MDK)中出现error: #513:
keil(MDK)中出现error: #513: a value of type "int" cannot be assigned to an entity of type &qu ...
- 在Keil MDK中创建STM32F4系列的工程模板(标准外设库)
在Keil MDK中创建STM32F4系列的工程模板(标准外设库) 一.前往ST官网下载标准外设库 二.根据个人风格创建文件夹目录 三.创建MDK工程,创建分组 四.添加系统启动必要源文件 五.添加头 ...
- keil MDK中如何生成*.bin格式的文件
在Realview MDK的集成开发环境中,默认情况下可以生成*.axf格式的调试文件和*.hex格式的可执行文件.虽然这两个格式的文件非常有利于ULINK2仿真器的下载和调试,但是ADS的用户更习惯 ...
- KEIL MDK中的RO、RW和ZI
KEIL MDK中的RO.RW和ZI DATA理解及KEIL中ROM和RAM使用大小计算 (2013-12-25 09:33:06) 转载▼ 标签: it 分类: 嵌入式相关 本文来源与网络 http ...
- Keil C中的sprintf函数
在写VC++及标准C程序时,我们常用sprint函数来将数值转换为字符串.可在Keil C中使用这个函数时就要注意了.请看下面例程: /*main.cDesigned by Bill LiuVersi ...
- 【Keil MDK中工程报错Browse information of one of more files is not available解决方法】
[Keil MDK中工程报错Browse information of one of more files is not available解决方法] 今天在进行工程编写时,出现了这个错误Browse ...
- Keil MDK 中利用串口及c标准库函数printf为cortex-m3做调试输出(lpc1788)
摘要: c标准库的printf是输出给显示器的,将printf函数进行修改,使其输出重定向至串口,就能实现目的.printf函数调用fputc函数完成实质输出单一字符的工作,因此将fputc函数修改使 ...
- Keil MDK中编译连接选项--keep的用法
使用Keil mdk编程,假如有一个有用的函数你定义了但是没有显式的调用,mdk在默认编译链接时,将会把这个函数从整个程序总删除掉,以节省ROM. 比如,你在ROM的0x00010000处定义了一个函 ...
- 解决KEIL MDK中JLINK烧录代码时提示the connected jlink is defective问题
1.问题分析 网上有许多分析这个问题的博客,可以去参考 2.解决方法 a.在segger.com的官网下载了6.5版本的jlink驱动文件,安装后C:/program file(x86)/Segger ...
最新文章
- 独家 | ​采用BERT的无监督NER(附代码)
- 通过Scroller.js制作上拉加载和下拉刷新
- 计算机插座符号,插座图形符号
- org.springframework.beans.factory.BeanCreationException:
- R语言:异常数据处理
- Vbox linux虚拟机桥接(VM操作也类似)
- HNOI2015 实验比较
- web.xml 中的listener、 filter、servlet 加载顺序
- bigdecimal 小于等于0_半场0-0比分的比赛,你需要注意这些
- exe打包工具哪个最好_一键分发工具哪个最好用?这款30万人都在用,很优秀!...
- 各种与视频编解码以及视频图像处理的应用相关的新技术,新方法,各种软件开发相关的算法,思想。...
- 改进的有效边表算法_优硕微展 | 张和慧:基于邻域保持嵌入算法的间歇过程故障检测研究...
- Ubuntu环境搭建二:搭建samba服务器
- iOS 报错 : dyld: Library not loaded: @rpath/
- 税务系统什么时候使用计算机,2020年税务师考试题量、答题要求及计算器使用规定...
- cad用计算机怎么计算坐标,CAD如何快速计算出图纸中任意点的坐标值
- ESPRESSIF AT指令集
- 常见互联网34个术语解释
- Visual Studio 2019 (VS2019)安装Spy++工具
- 一元线性回归python代码
热门文章
- MATLAB学习——MATLAB矩阵处理
- org.springframework.dao.InvalidDataAccessApiUsageException: Cannot locate field code on class .....
- js中数组删除对象的几种方式总结
- Thinkpad T490安装Ubuntu18.04问题总结
- 【eNSP 华为模拟器】常用的使用技巧与配置命令,提高你的配置速度
- 谷歌 smarthome_HomeKit不值得麻烦:改用Smarthome Hub
- 有了别人的发动机,能不能仿造出来?
- linux制作win10安装u盘,win10u盘安装系统怎样全新安装
- 十年前的经典日剧,悠长假期
- 最新版本dubbo-admin部署