我使用tm / mktime是错误的,如果没有,是否有解决方法?

时间:2016-02-09 19:20:41

标签: c time libc mktime

我认为以下程序应该从每年的第一天输出从1970年到1970年的秒数,然后在它编制的系统上lib/ext的大小({{1}是一个宏,所以我认为你不能只是复制已编译的可执行文件并假设它是正确的,尽管在实践中这些天所有的都使用了8位time_t

CHAR_BIT

然而,在OS X(10.11.3 15D21)上,这只能工作多年> = 1902,尽管char是64位签名。我可能会理解Apple的程序员是否懒惰并且在1970年之前的任何年份都没有支持,但正确的行为可以追溯到1902年然后停止看起来更像是我的错误。

2 个答案:

答案 0 :(得分:4)

咨询C标准:

  

范围以及clock_ttime_t中可表示的时间精度是   实现定义。 [..]

     

[N1570§7.27.1/ 4](强调我的)

更进一步,关于mktime

  

mktime函数返回编码为type的值的指定日历时间   time_t。如果无法表示日历时间,则函数返回该值   (time_t)(-1)

     

[N1570§7.27.2.3/ 3]

因此,只要mktime的返回值为(time_t)(-1)的年份不能正常工作......您就是自己的。

实际上,IMO,标准对所有这一切都有点安静:

  

[..] int tm_year; // years since 1900 [..]

     

[N1570§7.27.1/ 4]

这可能意味着自1900年以来的(正)年,但为什么要使用有符号整数。

作为旁注:在我的系统上(Linux 3.14.40 x86_64 glibc-2.21),我得到......

time_t is 64 bits
1 -62135600008
...
1969 -31539600
1970 -3600

考虑到部分工作:你当然可以看看正在做你想做的libc实现并尝试使用他们的代码(如果你可以遵守任何需要遵守的许可证)。 Here's我系统使用的那个。

答案 1 :(得分:0)

在UNIX OS中,通常有64位启用的时间函数版本。 OS X可能有类似的东西虽然我用快速搜索找不到它。有关详细信息,请参阅64 bit unix timestamp conversion

编辑: 我找到了一台Mac来测试它,不幸的是它似乎没有mktime64功能。虽然我没有亲自测试过,但我确实发现这个this library可以作为一种解决办法。