491

为什么是

1970 年 1 月 1 日 00:00:00

考虑纪元时间

4

5 回答 5

452

早期版本的 unix 以 1/60 秒为间隔测量系统时间。这意味着 32 位无符号整数只能表示小于 829 天的时间跨度。出于这个原因,数字所代表的时间0(称为epoch)必须设置在最近的过去。由于这是在 1970 年代初期,因此时代被设置为 1971-1-1。

后来,系统时间改为每秒递增,这将可以用 32 位无符号整数表示的时间跨度增加到 136 年左右。由于从计数器中挤出每一秒不再那么重要,因此时代被四舍五入到最接近的十年,因此成为 1970-1-1。人们必须假设这被认为比 1971-1-1 更简洁。

请注意,使用 1970-1-1 作为其纪元的 32 位有符号整数可以表示直到2038-1-19的日期,在该日期它将环绕到 1901-12-13。

于 2009-07-07T08:04:02.547 回答
55

历史

最早版本的 Unix 时间有一个 32 位整数,以 60 Hz 的速率递增,这是早期 Unix 系统硬件上的系统时钟速率。结果,60 Hz 的值仍然出现在某些软件界面中。纪元也与当前值不同。1971 年 11 月 3 日的第一版Unix Programmer's Manual 将 Unix 时间定义为“从 1971 年 1 月 1 日 00:00:00 开始的时间,以六十分之一秒为单位”。

于 2009-07-07T07:52:52.990 回答
11

http://en.wikipedia.org/wiki/Unix_time#History稍微解释了 Unix 时间的起源和所选择的时代。unix 时间和纪元日期的定义在稳定下来之前经历了一些变化。

但它没有说明为什么最终选择了 1/1/1970。

维基百科页面的重要摘录:

1971 年 11 月 3 日的第一版Unix 程序员手册将 Unix 时间定义为“从1971 年1 月 1 日 00:00:00 开始的时间,以六十分之一秒为单位”。

由于 [the] 范围有限,在将速率更改为 1 Hz 并将 epoch 设置为其当前值之前,多次重新定义了 epoch。

后来的几个问题,包括当前定义的复杂性,都是由于 Unix 时间是由使用逐渐定义的,而不是从一开始就完全定义的。

于 2009-07-07T07:53:26.483 回答
9

纪元参考日期

纪元参考日期是时间线上的一个点,我们从该点开始计算时间。该点之前的时刻用负数计数,之后的时刻用正数计数。

许多时代在使用

为什么将 1970 年 1 月 1 日 00:00:00 视为纪元时间?

不,不是时代一个时代。有许多时代在使用

这种时代的选择是任意的。

主要的计算机系统和图书馆使用至少几十个不同时期中的任何一个。最受欢迎的时代之一通常称为Unix Time,使用您提到的 1970 UTC 时刻。

虽然流行,Unix Time 的 1970 可能不是常见的。最常见的还有 1900 年 1 月 0 日,用于无数 Microsoft Excel 和 Lotus 1-2-3 电子表格,或者 2001 年 1 月 1 日,Apple 的 Cocoa 框架在全球超过 10 亿台 iOS/macOS 机器中的无数应用程序中使用。或者GPS设备使用 1980 年 1 月 6 日?

多粒度

不同的系统在计算时间时使用不同的粒度。

甚至所谓的“Unix 时间”也各不相同,有的系统计算整,有的计算毫秒。许多数据库(例如 Postgres)使用微秒。有些,例如Java 8 及更高版本中的现代java.time框架,使用nanoseconds。有些还使用其他粒度。

ISO 8601

因为在使用 epoch 参考和粒度方面存在很大差异,所以通常最好避免将时刻作为 count-from-epoch 进行通信。在时代和粒度的模糊性,加上人类无法感知有意义的值(因此错过错误值)之间,使用纯文本而不是数字。

ISO 8601标准提供了一套广泛的实用的精心设计的格式,用于将日期时间值表示为文本。这些格式很容易被机器解析,也很容易被跨文化的人类阅读。

这些包括:

  • 仅限日期:2019-01-23
  • UTC时刻: 2019-01-23T12:34:56.123456Z
  • 与UTC 偏移的时刻:2019-01-23T18:04:56.123456+05:30
  • 基于周的年份:2019-W23
  • 序号日期(一年中的第 1 天至第 366 天):2019-234
于 2019-01-21T01:51:01.087 回答
-11

简短的回答:为什么不呢?

更长的答案:时间本身并不重要,只要每个使用它的人都同意它的价值。由于 1/1/70 已经使用了很长时间,使用它将使您的代码尽可能地被尽可能多的人理解。

选择一个任意的时代只是为了与众不同并没有什么大的好处。

于 2009-07-07T07:42:58.940 回答