计算机使用不同的时间起点是因为不同的系统和应用程序设计选择了不同的纪元(epoch)。这通常与它们的历史和设计需求有关。以下是一些常见的时间起点:
-
从1900年开始:
struct tm
的tm_year
字段: 在 C 和 C++ 的标准库中,struct tm
用来表示分解的时间,tm_year
表示自1900年以来的年数。这是因为早期的C标准库设计时,选择1900作为基准年。这样设计是为了简化年数的计算(例如:2023
年表示为123
),并且当时计算机的使用范围有限,还不需要考虑百年以上的时间跨度。
-
从1970年开始:
- Unix纪元时间(Unix Epoch): Unix和Unix-like系统使用的时间起点是1970年1月1日00:00:00 UTC。这个选择是贝尔实验室在设计Unix操作系统时做出的,1970年是一个相对现代且从技术上管理方便的时间起点。Unix时间以秒为单位计算自该时间以来的时间,这是因为当时的设备能够容易地支持秒级精度。
-
从1980年开始:
- DOS和Windows文件系统时间: FAT文件系统(File Allocation Table),包括MS-DOS和早期的Windows版本,使用1980年1月1日作为其时间起点。这是因为FAT文件系统是在1980年代设计的,并且较早的操作系统(如MS-DOS)也在这个时间范围内开始使用。
这些时间起点的选择通常是出于简化计算、符合当时技术限制、以及与软件开发时间一致等因素的考虑。虽然不同的起点带来了一定的不一致性,但通过合适的转换函数,大多数现代计算机系统都能很容易地在这些时间表示之间进行转换。
实际使用中, 三种时间经常混乱,特别是utc时间,有的系统标注自己是utc时间,但是却不是从1970开始计算,简直坑人。
此外,某期货交易所从1980计算秒数,我一开始就觉得很诡异,现在看来,估计其系统就是从dos发展过来没有变过的。