为什么1970年1月1日是“纪元时间”?

520

为什么

1970年1月1日 00:00:00

被认为是纪元时间(epoch time)?


27
不确定为什么有人认为这是主观的。 'Epoch' 时间是一个标准时间戳方案。 - ConcernedOfTunbridgeWells
7
今天距离380,000小时前。 - mplungjan
24
我们应该从这个日期开始计算时间,所以现在是第44年。 - Leonardo Raele
5
今天,就在此刻,现在是1499969999!只需大约8个小时! - DrBeco
4
@LeonardoRaele 是的!比如,第二次世界大战是在公元前31年开始的! - Siavash Mortazavi
显示剩余3条评论
5个回答

483
早期的Unix版本将系统时间测量为每1/60秒一次。这意味着32位无符号整数只能表示不到829天的时间跨度。因此,数字0(称为时代)所代表的时间必须设置在最近的过去。由于这是在20世纪70年代初,所以时代被设置为1971-01-01。
后来,系统时间改为每秒递增,这将32位无符号整数可以表示的时间跨度增加到约136年。由于不再那么重要,需要从计数器中挤出每一秒,因此时代被舍入到最近的十年,即成为1970-01-01。必须假设这比1971-01-01更整洁。
请注意,使用1970-01-01作为时代的32位有符号整数可以表示日期直到2038-01-19,在该日期它将绕回到1901-12-13。

38
1/60是否与美国电网频率有关? - xtofl
68
这是当时系统板上一个振荡器的频率。由于它是在直流电下运行,所以振荡器不必是60赫兹,但是当时使用最常见的频率可能更加便宜,而且当时电视正在大规模生产... - Matt Howells
19
实际上,在过去,计算机时钟和 RTC(实时时钟)通常与美国电网波形同步,因为它非常可靠。这个波形会被乘以得到处理器时钟,除以得到 RTC 的秒数。 - Alexios
14
@mafioso:好的,我会在我的笔记本电脑上设置一个提醒,时间是2038年...1901年12月13日。 - user1779715
21
我会尽力为您翻译:@JediKnight 这只是我作为开发人员基于自己的经验所做的推测:更改标准需要时间,如果您的更改不被采纳,那么就会出现竞争性标准。解决时代问题的真正方案是使用64位整数,而不是将时代向前移动。 - Jake
显示剩余17条评论

58

历史.

最早的 Unix 时间版本采用一个32位整数,以60 Hz 的速率递增,这也是早期 Unix 系统硬件的系统时钟速率。某些软件界面中仍然出现了值为 60 Hz。同时,它的纪元时间也与当前值不同。1971 年 11 月 3 日发布的 Unix 程序员手册第一版将 Unix 时间定义为“自 1971 年 1 月 1 日 00:00:00 起,以每秒六十分之一的秒为单位计算的时间”。


2
时间戳是1970年1月1日,不是1971年1月1日。 - Steve Harrison
3
@SteveHarrison 是的,但它一开始并不是这样的。 - Reid

18

时代参考日期

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

使用多个时代

为什么1970年1月1日00:00:00被认为是时代时间?

不是 the 时代,而是 an 时代。有许多时代在使用

选择这个时代是任意的

主要的计算机系统和库使用至少几十个不同的时代之一。其中最流行的时代之一通常被称为Unix时间,使用了你提到的1970年UTC时刻。

虽然Unix时间很受欢迎,但它的1970年可能不是最常见的。在最常见的竞争中,无数Microsoft Excel和Lotus 1-2-3电子表格使用1900年1月0日,或者超过10亿台iOS / macOS设备中的Apple Cocoa框架使用了2001年1月1日。或者可能是GPS设备所使用的1980年1月6日?

多种粒度

不同的系统在计算时间时使用不同的粒度。即使所谓的“Unix时间”也有所不同,一些系统计算整个,而另一些则计算毫秒。许多数据库如Postgres使用微秒。一些系统,例如Java 8及更高版本中的现代java.time框架,使用纳秒。还有一些使用其他粒度。
由于在时代参考和粒度使用上存在如此多的差异,通常最好避免将瞬间作为从时代开始的计数进行传递。由于时代和粒度的歧义,再加上人类无法感知有意义的值(因此可能会错过错误的值),因此最好使用纯文本而不是数字。 ISO 8601标准提供了一组广泛的实用、设计良好的格式,用于将日期时间值表示为文本。这些格式易于机器解析,同时易于跨文化地阅读。这些包括:

11

http://en.wikipedia.org/wiki/Unix_time#History 解释了Unix时间和选定纪元的起源。 Unix时间的定义和时代日期在稳定在现在之前经历了几次变化。

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

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

1971年11月3日出版的《第一版Unix程序员手册》将Unix时间定义为“从1971年1月1日00:00:00起,以每秒六十分之一秒的速度测量的时间”。

由于范围有限,该时代已经多次重新定义,直到速率更改为1 Hz并将时代设置为其当前值。

Unix时间逐渐通过使用定义而不是完全定义的结果导致后来的几个问题,包括目前定义的复杂性。


-11

简短回答:为什么不呢?

更长的回答:时间本身并不重要,只要使用它的人都同意其价值。由于1970年1月1日已经被使用了这么长时间,使用它将使您的代码尽可能地易于理解,适用于尽可能多的人。

选择一个任意的纪元只是为了与众不同,并没有太大的优点。


42
因为Unix操作系统是在1969年开发并于1971年首次发布的,因此可以合理地假设没有机器需要表示1970年1月1日00:00:00之前的系统时间。 - Jörg W Mittag
3
作为历史模拟游戏的开发者,有些时间对象的设计者似乎认为所有程序只需要表示未来或最近的日期,这看起来相当愚蠢。当然,我们可以编写自己的表示方式或进行调整,但仍然存在这个问题。 - Dronz
8
同样的问题也适用于“实际”的非游戏应用,例如商业电子表格、科学数据展示、时间机器界面等等。 - Lenoxus
9
请注意,这是为一台使用晶体管和二极管作为逻辑门进行计算的CPU(当时没有芯片!)的价值72,000美元、只有9KB RAM的计算机设计的。因此,制作最基本的可用功能并不是“愚蠢”的做法。 - Camilo Martin
3
OP在宏观层面上是正确的,我们制定的关于时间的计划总是相当任意的。一年中的天数,月份中的天数,公元前"0"年以及闰年规则...都有些疯狂。每个系统只是一系列垃圾妥协的产物,因为这是他们能够用现有技术做到的最好的,并且足够适用于他们的立即使用案例。这也适用于所有工程项目 :) - Indolering
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接