首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mktime返回错误值。

mktime返回错误值。
EN

Stack Overflow用户
提问于 2016-06-08 22:30:53
回答 1查看 3.4K关注 0票数 2

我喜欢在微控制器上使用mktime (或者至少使用32位宽时间戳)。我从avr libc源文件中添加了所需的文件(在Atmel Studio 7中,时间函数不可用),没有改变算法。但2016年。06。08。23:34:00 (UTC+1,EU ),mktime返回518736960,但它应该返回1465425240

代码语言:javascript
复制
set_zone(ONE_HOUR);
set_dst(eu_dst);
struct tm myTime;
myTime.tm_sec = 0;
myTime.tm_min = 36;
myTime.tm_hour = 23;
myTime.tm_mday = 8;
myTime.tm_mon = 5;
myTime.tm_year = 116;
myTime.tm_isdst = ONE_HOUR;
time_t tim = mktime(&myTime);

我做错了什么?这些功能应该可以正常工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-08 22:58:28

518736960对应于Unix时代时间1986年6月9日21:36:00;在我看来,这个实现似乎使用了一个不同的时代,从2000年1月1日开始,而不是1970年1月1日。

时差则可归因于TZ和DST的抵消。日期差的原因是2000年不是闰年,而是1970年。

编辑:

文档这里清楚地指出,划时代的起点是2000年:

虽然标准中没有指定,但通常预计time_t是一个有符号整数,表示从1970年1月1日午夜开始的偏移量。即“统一时间”。此实现使用从2000年1月1日午夜开始的无符号32位整数偏移。使用这一“时代”有助于简化转换函数,而32位值允许正确地表示时间,直到Tue Feb 7 06:28:15 2136 UTC为止。宏UNIX_OFFSET和NTP_OFFSET的定义是为了帮助转换到Unix和NTP时间戳。

没有关于时代的标准,也没有time_t的特定的潜在宽度或符号。但是,如果您往返于mktime()localtime()的结果,例如使用相同的库,它将产生一个正确的结果。一个库或系统的time_t值不需要与另一个库兼容,因此在系统之间交换time_t值有点问题。

在这种情况下,您可以通过添加UNIX_OFFSETNTP_OFFSET来转换为公认的事实标准,并在必要时确保在接收系统上执行任何相应的调整,该原则类似于https://en.wikipedia.org/wiki/Endianness#Networking的原则,例如,通过使用商定的中间表示在具有不同端点的系统之间交换数据(这也是交换time_t时要考虑的事情)。

通常情况下,交换指定格式的字符串(如ISO 8601)比较简单,以避免时代性、数据类型和endianness差异。另一方面,与字符串表示之间的转换比纯算术操作更昂贵。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37714019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档