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

Bak*_*dan 33 timestamps

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

Kei*_*son 43

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

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

  • `time` 函数比 epoch 更旧:[Unix v1](http://man.cat-v.org/unix-1st/2/sys-time)(1971 年)以 1/60 为单位计算一秒钟,从 1971/01/01 午夜开始。这已经是一个 [已知错误,“有时间顺序的用户会注意到 2**32 秒的 60 分之一秒只有大约 2.5 年。”](http://man.cat-v.org/unix-6th/ 2/time) `unsigned` 是由 [K&R 在 1978 年](http://en.wikipedia.org/wiki/C_(programming_language)#K.26R_C) 引入的,早在 1970 年时代建立之后。 (9认同)

amp*_*ine 15

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

  • 这使得过去只有 68 年 - 1902 年。这似乎有点小。 (2认同)
  • POSIX 不要求 `time_t` 只有 32 位;在许多系统上它已经是 64 位了。 (2认同)
  • @mtraceur:C 标准不需要失败的 `mktime()` 调用来设置 `errno`。(POSIX 确实如此。) (2认同)