Unix 纪元时间

作者: 影子喵喵喵 | 来源:发表于2023-07-13 10:34 被阅读0次

    1969年,贝尔实验室的大神Ken Thompson开始开发Unix操作系统。

    一、问题

    在开发过程中,他遇到个问题:

    这个问题就是:如何在Unix中表示日期和时间?

    这个问题非常重要,因为日期和时间管理对于任何操作系统来说都是关键功能,包括文件时间戳、程序调度、日志记录等。

    最容易想到,也是最简单的办法就是用一个字符串来表示,例如:

    1970-09-17 00:00:30.751

    有年月日,时分秒,还有细粒度的微秒,并且可读性非常强。

    但是这种方式明显不符合Unix的设计原则:简洁,一致性,易于使用。

    原因很简单:

    (1) 存储效率低下

    字符串需要占用大量的空间,处理起来也更复杂

    (2) 计算复杂性读比较高

    比如要计算两个时间的差值,需要先解析字符串,然后进行更复杂的日期和时间计算。

    二、解决方法

    最后Ken决定用一个整数来表示日期和时间。

    因此,需要先确定一个开始时间(纪元),然后这个整数表示从纪元开始到当前时间流逝的秒数。

    而这个纪元设定为:1970年1月1日 00:00:00

    如果这个整数是:1631280731,那就表示 2021-09-10 13:45:31 UTC。

    Ken Thompson决定把这种方式成为Unix Epoch Time(Unix 纪元时间)

    用一个整数来表示时间戳,有几个主要的优势:

    (1) 简化

    通过将日期和时间表示为一个单一的整数,可以大大简化日期和时间的计算。例如,计算两个日期之间的差异就只需要对两个整数进行减法运算。

    (2) 便于存储和处理

    整数易于存储(占用的空间较少)且便于在各种编程语言中处理。

    (3) 兼容性

    Unix时间戳可以在不同的操作系统和平台之间轻松地进行交换和比较。

    (4) 全球统一

    Unix时间戳是从同一时刻(1970年1月1日00:00:00 UTC)开始的,所以它提供了一种在全球范围内统一的时间表示方式。

    当然,Unix时间戳也有其限制。例如,它不能很好地处理闰秒,而且直接查看Unix时间戳并不能很好地理解当前的日期和时间。

    三、隐患

    在上世纪六七十年代,电脑主要还是16位的,Ken Thompson把Unix时间戳确定为32位整数,他觉得已经够大了,再说了谁会知道Unix操作系统能用多久呢?

    让人想不到的是Unix一直存活了下来,它的很多概念对整个计算机科学和软件开发领域产生了深远的影响,包括时间和日期的处理方式。类Unix的开源操作系统Linux继承了Unix的衣钵,甚至统治了服务器端的OS市场。

    开发Linux的时候,也是采用了32位的整数来记录时间戳。

    现在一个大问题来了,32位的有符号整数最大值是2147483647 ,只能让我们用到2038年1月19号 03:14:07 UTC 

    下面这个动图展示了整数溢出以后的效果:

    这被称为Y2K38问题。

    解决方案也非常简单,就像IPV6一样,用128位IP,可以给地球上每一粒沙子都赋予一个IP地址,并且还有大量剩余。

    Unix Epoch time 可以把32位的整数变成64位。

    使用64位整数,可以表示到接近290亿年后的时间,不知道那个时候地球还是否存在?

    大概是从Linux 5.6版本开始,Linux内核开始全面支持64位时间戳的系统调用,但是升级了内核以后,并不意味着完事大吉,应用程序和库在编写的时候如果使用了time_t类型(早期是32位的),现在需要改成64位整数,然后重新编译,要不然依然会产生溢出问题。

    嵌入式系统最有可能受到Y2K38问题的影响,一般的服务器软件通常会定期进行升级,打补丁,但是嵌入式软件一旦随着硬件发布出去,就很少更改,很可能会运行到2038年。

    尾记

    在Unix Epoch Time确定下来30年后,一个准备转行Java程序员的年轻人打开了Java 的Date类。

    Date内部实际上存储的就是一个长整型的数(long),它表示的是自1970年1月1日 00:00:00 (即Unix Epoch时间)以来的毫秒数。

    他觉得非常奇怪:为什么是1970年1月1日 00:00:00呢?是谁确定了这么一个古怪的日期呢?

    相关文章

      网友评论

        本文标题:Unix 纪元时间

        本文链接:https://www.haomeiwen.com/subject/oyrmudtx.html