千年虫及UNIX时间

转自:http://hi.baidu.com/dugucloud/blog/item/b903ba803e5192c59123d99d.html

千年虫何来?

在上个世纪,许多计算机系统只用二进制7~8位数(足够十进制二位数使用)表示年份,比如说1986年就表示成86,1998年表示成98。一旦遇到输出年份的时候,系统就会使用类似于如下C++语言所表示的方法(year变量表示计算机系统中的年份,outstream表示输出流):

    outstream << "19" << year << "年";

或者这样(不输出前面的“19”,也许是刚才那个网站用的方法):

    outstream << year << "年";

如果用这种方法表示下去,2000年时year变量的值就会变为100,那么实际输出时就成了“19100年”或者“100年”了!显然,刚才那个网站出的就是这种问题。有些系统自作聪明地检查到了越界,只取十进制后两位,year的值就成0了!

Unix的时间表示方法

而在Unix操作系统,时间是用二进制32位整数表示的(其中有一位是符号位,也就是说实际有效的是31位),具体是1970年1月1日0时0分0秒到现在的秒数。根据这个秒数可以推算出现在的日期和时间,也就没必要单独为年、月、日、时、分、秒单独设一个变量来存储了。这样设计的系统底层,只要上层开发者不偷懒就行了;就算偷懒,修改程序的代价也小得多。按照这种计时法,最长可以用到2038年1月19日,到了那时候怎么办呢?

不过在64位Unix系统上,时间是用二进制64位整数表示的,可以使用将近3000亿年!随着64位个人电脑(内存通常大于4GB)的普及,“2038年问题”就会迎刃而解。而真正有待解决的,可能是一些嵌入式Linux系统吧。

你可能感兴趣的:(千年虫及UNIX时间)