为什么Unix将时间戳存储在有符号整数中?


24

为什么用带符号整数表示时间戳?在1970年有一个明确定义的开始,表示为0,那么为什么在此之前需要数字呢?是否在任何地方都使用负时间戳?


2
这就是为什么Nostradamus不能使用他的计算机来写他对3000多年的预测的原因……这将导致溢出并显示他的日期为负数。我认为他们称它为Y3K错误或类似的东西!
2011年

3
当年份数字从负数变为正数时,古罗马人面临的问题甚至更严重。如果他们有办法表达数字零,他们会称之为Y0K问题。8-)}
Keith Thompson

Answers:


35

C的早期版本没有无符号整数。(一些程序员在需要无符号算术时使用了指针。)我不知道time()函数或无符号类型是第一个出现的,但是我怀疑在无符号类型普遍可用之前就已经建立了表示形式。而2038年在未来已经足够远了,可能不值得担心。我怀疑很多人认为到那时Unix仍然会存在。

签名的另一个优点time_t是将其扩展到64位(在某些系统上已经发生过),可以让您代表未来几千亿年的时间,而又不会失去代表1970年之前的时间的能力。(这就是为什么我反对切换到a 32位无符号 time_t;我们有足够的时间过渡到64位。)


7
time功能早于时代:Unix v1(1971年)从1971/01/01午夜开始以1/60秒为单位进行计数。这已经是一个已知的bug说,“时间-志同道合的用户会注意到asecond的2个**六十零分之三十二仅约2.5年。” unsigned被介绍了K&R于1978年,成立了1970年时代后良好。
吉尔斯(Gilles)'所以

我在64位Linux机器上进行了快速测试。gmtimelocaltime在2147483647年(在将-2147483648作为年份之后的第二秒)中最大输出。因此,要想获得超过55位的时间,就必须更新输出例程以在一年中使用64位int而不是无符号的32位int。希望在未来的数十亿年中的某个时候可以解决这个错误。
弗赖海特

@freiheit:有趣。那里的问题是该struct tm类型具有类型的成员tm_year(表示自1900年以来的年份)int。64位系统可以轻松拥有64位time_t,但通常具有32位int。(如果char是8位,int是64位,则short可以是16位或32位,并且其他大小将没有预定义的类型。)但是,time()这可能是唯一<time.h>真正需要系统级支持的功能。您可以编写自己的代码以将time_t值转换为人类可读的字符串。
基思·汤普森

12

它支持1970年1月1日之前的时间戳和日期。


1
这仅过去了68年-1902年。这似乎很多。
巴库丹

2
POSIX不需要time_t只有32位。在许多系统上已经是64位。
基思·汤普森

1
mktime()函数-1在出现错误的情况下会返回,因此可能无法区分1970-01-01之前的正确时间戳和ts。禁止在
1970年1

@DimG:很难区分错误和特定的时间戳1969-12-31 23:59:59 UTC。除了-1明确的负值。
基思·汤普森

1
@mtraceur:C标准不需要mktime()调用set 失败errno。(POSIX会这样做)
。–基思·汤普森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.