我认为以下程序应该从每年的第一天输出从1970年到1970年的秒数,然后在它编制的系统上lib/ext
的大小({{1}是一个宏,所以我认为你不能只是复制已编译的可执行文件并假设它是正确的,尽管在实践中这些天所有的都使用了8位time_t
。
CHAR_BIT
然而,在OS X(10.11.3 15D21)上,这只能工作多年> = 1902,尽管char
是64位签名。我可能会理解Apple的程序员是否懒惰并且在1970年之前的任何年份都没有支持,但正确的行为可以追溯到1902年然后停止看起来更像是我的错误。
答案 0 :(得分:4)
咨询C标准:
范围以及
clock_t
和time_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可以作为一种解决办法。