2000年问题

2000年问题（Year 2000 Problem，简称：Y2K），中国大陆及香港常称-{zh-hans:千年虫;zh-hant:千年虫;}-问题，台湾则称-{zh-hans:千禧虫;zh-hant:千禧虫;}-危机，是一个计算机程序在日期表达上的设计缺陷，该缺陷会导致计算机错误识别2000年及之后的年份，从而导致其日期识别紊乱，使得计算机执行任何与时间相关的任务时都会出错，进而影响整个系统的运行。该问题主要涉及到许多老旧的计算机，为了节省存储空间，它们的程序普遍采用6位数字来存储时间，只取4位年份数字中的后2位数字用于表示年份。这种做法使得计算机无法识别和更变前两位年份，从而导致了年份的误读。很多这些老旧的计算机直到临近2000年时都还工作在政府部门、军队、基础设施与许多重要行业当中。一旦工作在这些领域的计算机出现问题，将可能导致从停水、断电，银行瘫痪到核电厂事故和军械失控等一系列灾难性的后果。
自20世纪90年代开始，2000问题逐渐透过媒体的传播引起了人们的关注，同时也引发了大众恐慌。针对该问题进行的全球性大规模修复行动也随之开始，全世界为修复2000年问题前后累计投入了约3080亿美元，而在持续数年的修复之后，该问题最终得到了有效解决，没有在新千年到来之际大规模爆发。
问题起因.
虽然2000年问题的中文别称“千年虫”常使人将其误认为电脑病毒，但实际上它只是一个计算机程序在日期表示方面的缺陷，并非恶意编写的电脑病毒。该问题起始于20世纪50年代到60年代，那时计算机的存储器价格极为昂贵，并且容量很小，早期的磁芯存储器价格平均为每比特1美元，而在同一时期，一块大小仅为1MB的硬盘价格即为761,000美元。且当时的计算机仍旧采用打孔卡来存储数据，一个最常见的IBM打孔卡只有80列宽，能储存的数据也极其有限。因此，程序员在编写程序时需要尽可能的节省存储空间，以最大程度的降低存储成本。因此，当时的程序员普遍在编写程序时采用六位数来存储时间，只取四位数年份中的后两位来表示年份，例如，1976年10月23日就会被简短的存储为23/10/76或10/23/76。对当时的情况来说，六位数日期表示法有很大的作用，它能够减小程序的内存需求，并减少一个程序所要占用的打孔卡卡数。事实上，这种做法在更早之前的时代就已经被使用。在要处理大量日期数据时，六位数日期表示法还能发挥更大的作用。例如，一间拥有一千万客户，每个客户每天交易三次的银行若要在计算机中存储一周所有客户的交易时间，只取两位数年份能为这家银行省下60兆字节的存储空间。后来，随着科技的发展，到了20世纪70年代，磁芯存储器的价格逐渐下降到仅为每比特1美分。而同时，具有同样价格，但尺寸更小且更便于使用的DRAM也开始逐步替代了磁芯存储器，打孔卡亦被逐渐淘汰，存储技术的进步和其价格的大幅降低使得存储空间不再是一个紧迫的问题。在程序中使用六位数日期的必要性也越来越低，但其并没有就此退出历史舞台，出于程序员们的习惯，以及为了保持向上兼容，这一日期表示法被一直沿用下来，即使当时已经有人提出过在这一日期表示法下潜藏的问题，但当时的程序员普遍都认为自己编写的程序不可能被持续使用到新千年，并没有理会这些警告。
六位数日期表示法虽然的确在节省存储空间上发挥出了作用，但这种模糊的表示法也为未来埋下了隐患。人们在日常生活中为了方便有时也会只用两位数简称一个年份，但计算机和人类的区别在于，人类拥有能够理解并补全前两位年份数字的能力，但计算机没有。它们只会读取被实际写出来的后两位年份，无法自行变更没被实际写出来的前两位年份数字。这就导致了一个问题：在六位数日期下，2000年1月1日将会被转为01/01/00，然而，由于前两位年份没被实际写出来，也就无法进行变更，计算机就会继续将前两位默认为“19”，如此一来，就使得计算机会将2000年误认为1900年，认为被缩写为“00”的2000年要早于被缩写为“99”的1999年。这会导致计算机在执行任何涉及到日期的任务时出错，甚至引发崩溃。例如，医生要使用一台计算机为一位出生在2000年的婴儿计算要为他使用的药物剂量，若这台计算机仍旧使用六位数日期表示法，其就会将这位婴儿误认为是一位出生在1900年的百岁老人，并对医生给出一个适用于老年人的药物剂量，但这个剂量对新生儿来说可能会是致命的。若不对该问题加以修复，诸如此类的故障会在2000年到来时在全球爆发，影响到所有依赖这些有缺陷的计算机运作的基础设施和军政机关，导致停电停水、医疗瘫痪、通信终止到导弹误射等一系列灾难性的后果。
此外，2000年问题也会在除2000年1月1日以外的日期造成影响，并且也不止会导致计算机误判2000年及之后的年份。因为问题的根源是计算机无法变更前两位的年份数字，其也会导致计算机错误判定1900年之前的年份；而一些使用数字99或9999作为文档终止标记或停止代码，且仍旧采用两位数年份表示法的计算机则可能会在1999年9月9日出现故障；另外，一些计算机由于采用了不正确的闰年识别算法，致使其无法将2000年正确识别为闰年，从而导致它们在2000年2月29日、3月1日、12月31日和2001年1月1日出现故障，该问题也属于2000年问题的范畴之内。其它会致使2000年问题的原因还包括将“19”硬编码到软件子程序中、采用可能会致使存储寄存器填满从而发生溢出的日期数据类型。
引起关注.
1958年，当时在IBM工作的在为耶稣基督后期圣徒教会编写族谱记录软件时意识到了六位数日期写法的缺陷，他在之后的数十年里不断在各处做出对六位数日期写法缺陷的担忧，并呼吁人们转用标准的八位完整日期写法，但都没有起到很大的作用。其于1971年在霍尼韦尔计算机期刊上发表了一篇题为《What's the Date？》的文章，建议人们使用标准的规范日期写法，这被认为是世界上第一篇公开发表的2000年问题警告文章，1979年，他再于杂志发表另一篇文章《Time and the computer》，进一步深入探讨了日期表示问题，他在这篇文章中也提到了2000年闰年问题，他还为COBOL添加了PICTURE子句，以允许程序员能够在程序中使用四位数年份，此后他一直坚持向业界发出警告，直到他在1982年退休。
问题的引申.
有些程序可能会免在2000年出现闰日而强行修改计算日期的过程。这些程序如果继续在将来的闰年使用的话，有可能会导致日期错乱。
另一方面，对于使用其它历法的地区，如台湾的民国纪年或日本的和历，类似问题也有可能在之后的年份出现。例如：民国100年就在2011年。如果所用的软件没有解决两位年份的问题，那其实只是将两千年问题从2000年推迟11年后再发生。
对于目前在世界上广泛用作服务器软件的Unix系统来讲，由于传统的Unix系统使用32位的整型数表示日期（这个32位数字表示从1970年1月1日起至所存储日期过去了多少秒），因此在2038年日期将会被卷回，这类似于2000年问题。时间将可能重新从1970年1月1日开始计算，这将可能引起世界范围的计算机故障。这被称为2038年问题。
此外，是否存在10000年问题。还是一个遥不可及的问题。
问题的延续.
有观点认为过了公元2000年之后，「千年虫」的问题就会自动消失。然而，若然没有对编程方式作合适的修订，问题在过了公元2000年依然会出现。以下为两个在公元2008年曾经出现的千年虫问题：
日本平成时代的结束与新千年虫.
1999年年底，在全世界程序员在为千年虫问题焦虑的的时候，日本程序员却灵机一动：如果继续沿用昭和（1926年开始）年号的话，千年虫会足足延后25年（延至2025年）。如此之长的时间足够解决这次的问题了。然而日本在2019年改元为令和时，不但要更改年号，而且昭和时代年号计算的“新千年虫”（昭和100年）马上就要来临（昭和100年问题）。