2020年对Unix来说是重要的一年。年初,Unix迎来了50岁生日。
虽然Unix的一些早期开发早于正式开始它的“新纪元”之前,但是1970年1月1日仍然是POSIX时间的起点,也是所有Unix事物公认的起点。2020年1月1日将是50周年纪念日。
Unix时间vs人类时间
就人类的时间而言,50年是一件大事。就Unix时间而言,50年并没有什么特别的。48.7年也同样重要。
Unix(包括Linux)系统将日期/时间值存储为自1970-01-01 00:00:00 UTC以来经过的秒数,以32位表示。要确定从那个时间起经过了多少秒,以及现在的Unix时间值,可以发出如下命令:
$ date +%s 1576883876
的% s参数告诉date命令将当前日期/时间显示为自1970-01-01开始的秒数。
Unix系统可以管理多少时间?
为了了解Unix系统可以容纳多少时间,我们需要查看32位字段的容量。可以这样计算:
$ echo '2^32' | bc
4294967296
但是,由于Unix需要容纳负数,所以它为数字的符号保留一位,从而将其减少为:
$ echo '2^31' | bc
2147483648
而且,由于Unix编号从0开始,这意味着我们有2,147,483,648个值,但是最大的可能值是2,147,483,647。Unix日期/时间值不能超过这个数字—就像您汽车上的里程表可能不能超过999,999英里一样。加1等于0。
一年有多长?
大多数年份的秒数可以这样计算——小时/天乘以分钟/小时乘以秒/分钟乘以一年中的天数:
$ expr 24 \* 60 \* 60 \* 36531536000
在闰年,我们只增加了一天:
$ expr 24 \* 60 \* 60 \* 366 31622400
Unix将如何度过它的50岁生日?
2020年1月1日中午12点1577836800在时代的时间。这个计算有点复杂,但主要是因为我们必须适应闰年。自新纪元开始以来,我们有12个闰年,从1972年开始,最后一个是2016年。到2020年,我们将有38个正常年份。
这是一个使用expr在这50年里计算秒数的命令:
$ expr 24 \* 60 \* 60 \* 365 \* 38 + 24 \* 60 \* 60 \* 366 \* 12 1577836800
前一半是计算38个非闰年的秒数。然后,我们在闰年加上一个类似的计算,即闰年的366天。相反地,你可以使用之前给出的秒数,然后这样做:
$ expr 31536000 \* 38 + 31622400 \* 12 1577836800
这种跟踪日期和时间的方法使Unix系统几乎不受2000年问题的影响。1999年末,人们担心进入2000年将对计算机系统造成严重破坏。经历的问题比人们担心的要少得多。事实上,只有以两位数格式存储年份的应用程序才会将年份变为00作为时间向后跳转的标志。尽管如此,许多应用程序开发人员仍有一些繁琐的额外工作要做,以确保他们的系统在2000年到来时不会遇到严重的问题。
当Unix时间将运行问题
Unix系统不会遇到aY2K问题的类型2038当如上所述存储的日期将超出其32位空间分配时。但那是18年后的事了,内核开发人员已经在研究如何避免灾难。现在开始恐慌还为时过早。
2038年的问题有时被称为Y2K38问题。我们必须在2038年1月19日星期二之前解决这个问题。如果这个问题没有解决,系统在那个日期之后可能会认为是1901年。解决这个问题的一种方法是切换到64位的日期/时间信息表示。有些人认为,即便如此,情况也比听起来要复杂得多。无论如何,现在恐慌可能还为时过早。同时,在这个除夕唱完《友谊地久天长》之后,您可以向Unix唱“生日快乐”。已经50岁了,这仍然是一件大事。