转自: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系统吧。