硬件平台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(&times);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函数进行时间戳转换相关推荐

  1. keil(MDK)中出现error: #513:

    keil(MDK)中出现error: #513: a value of type "int" cannot be assigned to an entity of type &qu ...

  2. 在Keil MDK中创建STM32F4系列的工程模板(标准外设库)

    在Keil MDK中创建STM32F4系列的工程模板(标准外设库) 一.前往ST官网下载标准外设库 二.根据个人风格创建文件夹目录 三.创建MDK工程,创建分组 四.添加系统启动必要源文件 五.添加头 ...

  3. keil MDK中如何生成*.bin格式的文件

    在Realview MDK的集成开发环境中,默认情况下可以生成*.axf格式的调试文件和*.hex格式的可执行文件.虽然这两个格式的文件非常有利于ULINK2仿真器的下载和调试,但是ADS的用户更习惯 ...

  4. KEIL MDK中的RO、RW和ZI

    KEIL MDK中的RO.RW和ZI DATA理解及KEIL中ROM和RAM使用大小计算 (2013-12-25 09:33:06) 转载▼ 标签: it 分类: 嵌入式相关 本文来源与网络 http ...

  5. Keil C中的sprintf函数

    在写VC++及标准C程序时,我们常用sprint函数来将数值转换为字符串.可在Keil C中使用这个函数时就要注意了.请看下面例程: /*main.cDesigned by Bill LiuVersi ...

  6. 【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 ...

  7. Keil MDK 中利用串口及c标准库函数printf为cortex-m3做调试输出(lpc1788)

    摘要: c标准库的printf是输出给显示器的,将printf函数进行修改,使其输出重定向至串口,就能实现目的.printf函数调用fputc函数完成实质输出单一字符的工作,因此将fputc函数修改使 ...

  8. Keil MDK中编译连接选项--keep的用法

    使用Keil mdk编程,假如有一个有用的函数你定义了但是没有显式的调用,mdk在默认编译链接时,将会把这个函数从整个程序总删除掉,以节省ROM. 比如,你在ROM的0x00010000处定义了一个函 ...

  9. 解决KEIL MDK中JLINK烧录代码时提示the connected jlink is defective问题

    1.问题分析 网上有许多分析这个问题的博客,可以去参考 2.解决方法 a.在segger.com的官网下载了6.5版本的jlink驱动文件,安装后C:/program file(x86)/Segger ...

最新文章

  1. 独家 | ​采用BERT的无监督NER(附代码)
  2. 通过Scroller.js制作上拉加载和下拉刷新
  3. 计算机插座符号,插座图形符号
  4. org.springframework.beans.factory.BeanCreationException:
  5. R语言:异常数据处理
  6. Vbox linux虚拟机桥接(VM操作也类似)
  7. HNOI2015 实验比较
  8. web.xml 中的listener、 filter、servlet 加载顺序
  9. bigdecimal 小于等于0_半场0-0比分的比赛,你需要注意这些
  10. exe打包工具哪个最好_一键分发工具哪个最好用?这款30万人都在用,很优秀!...
  11. 各种与视频编解码以及视频图像处理的应用相关的新技术,新方法,各种软件开发相关的算法,思想。...
  12. 改进的有效边表算法_优硕微展 | 张和慧:基于邻域保持嵌入算法的间歇过程故障检测研究...
  13. Ubuntu环境搭建二:搭建samba服务器
  14. iOS 报错 : dyld: Library not loaded: @rpath/
  15. 税务系统什么时候使用计算机,2020年税务师考试题量、答题要求及计算器使用规定...
  16. cad用计算机怎么计算坐标,CAD如何快速计算出图纸中任意点的坐标值
  17. ESPRESSIF AT指令集
  18. 常见互联网34个术语解释
  19. Visual Studio 2019 (VS2019)安装Spy++工具
  20. 一元线性回归python代码

热门文章

  1. MATLAB学习——MATLAB矩阵处理
  2. org.springframework.dao.InvalidDataAccessApiUsageException: Cannot locate field code on class .....
  3. js中数组删除对象的几种方式总结
  4. Thinkpad T490安装Ubuntu18.04问题总结
  5. 【eNSP 华为模拟器】常用的使用技巧与配置命令,提高你的配置速度
  6. 谷歌 smarthome_HomeKit不值得麻烦:改用Smarthome Hub
  7. 有了别人的发动机,能不能仿造出来?
  8. linux制作win10安装u盘,win10u盘安装系统怎样全新安装
  9. 十年前的经典日剧,悠长假期
  10. 最新版本dubbo-admin部署