千年虫

想法 · 2022-01-04

不知道不觉又跨年了,在我还年轻的时候有一个特殊的跨年,就是进入2000年的千年,这不止是千位数的改变,同时也让当时的人记住了一个名词 -- 千年虫(Year 2000 Problem,简称Y2K)

我记得当时还小,所有人都在谈千年虫,但实际上又基本没什么人知道到底啥是千年虫,还没等我长到足够的智力去问这个根本原因时这事就过去了,大家也就都不关心了。在我费劲巴拉找了半天资料后发现,当年互联网确实不够发达,网上并没有留下太多根本原因的记录,而且对于我这种非当时的程序员来说并不太理解当时产生这种问题的操作。

具体原因是早期大家使用日期时是用6位数字来表示的,比如1999年12月31日就是991231这6位数,这个习惯号称是来自第一位女程序员(同时也是第一个bug的发现者,Grace Murray Hopper),之后被COBOL语言继承,进而传播到全世界。这个是在1944年时就埋下来的种子,问题是到了2000年1月1日时这6位数字就变成了000101,这时候会带来的问题就是这个数字是代表1900年呢,还是2000年呢,你可能会想问题不大,大家统一认为是2000年就可以,但是对于需要计算时间差的程序来说就是灾难了,比如银行计算利息,就得用000101减掉991231,一算你还欠银行一大笔钱;飞机在天上飞,一算时间差也不对。金融系统乱了、计时系统也乱了,世界差不多也就完蛋了。

早期程序员们可能没有想到自己的程序会用这么多年,有这么深远的影响,但对于现在的程序员来说,这种时间的表示方法是很奇怪的,现在一般是怎么用的呢?现在有一个概念叫做时间戳,是自1970年1月1日0点为起始点按秒的计数(忽略掉闰秒),比如0就是1970年1月1日0点0分0秒,每过一秒钟,这个数就加一,用这个数来表示时间,所以2022-01-04 20:11:05就是1641298265这个数,这种表示方式就脱离了具体年份月份这类人为概念,并且可以充分节省了计算机时间的占用空间,比如之前用6位数字的话那一位数字在计算机内实际是占用8个2进制位,实际就是96个二进制位,能表示100年内的时间,而且只能表示出日期,如果按这个表示方式加上时间的话那就需要再加64个2进制位,总共就是160个二进制位表示100年内精确到秒的时间,但如果用64位二进制来直接表示为时间戳的话可以从1970年表示到275760年。实际上也基本上是这么做的,不过不同语言不同,有些语言会用64位秒数来表示到275760年,有些会用毫秒来计时间,所以表示不到那么远,还有一些会用32位来表示,比如知名的MySQL数据库,它是只能表示到2038年,也就是说到了2038年后时间又将不够用了,到时候就又会有一个2038虫问题。

大问题总是由一个随意的行为留下的,随着时间的滚动,这种问题总会存在,就像短篇小说《祸害万年在》中提到的那样,那时间这种值到底怎么存?可能还是个问题

Theme Jasmine by Kent Liao Modified by eLangX