计算机2000年问题揭秘 邓晓辉、曾光 1998年 第47期 07版   21世纪的第一声钟声敲响,一场悲喜剧开始上演:   导弹、火箭腾空而起,竞相争艳;电梯失控;家用电器罢工;存款人一夜暴富……   这一切会成真吗?   无论你是否为电脑用户,都可能遭遇计算机2000年问题(简称Y2K问题)。随着2000年的临近,关于2000年计算机问题所引发的种种后果的预测,引起全世界的广泛关注和高度紧张。在我国,今年8月14日,国务院办公厅就解决计算机2000年问题专门下发了文件《关于解决2000年问题的通知》,其中有明确规定:要强制解决计算机2000年问题。对因玩忽职守,未及时解决计算机2000年问题而造成重大损失或不良后果的部门和单位,要追究其主要负责人的责任。由于不可克服的原因,届时不能完全解决计算机2000年问题的部门和单位,要从现在开始就制定切实可行的应急方案和措施,并报有关主管部门审定,确保不影响正常的生产和工作。要解决2000年问题,估计全球总共需花费30000~50000亿美元,如果计入法律诉讼费用可达70000亿美元。 #1Y2K问题的由来   在本世纪60年代末,信息的存储手段还很落后,存储器的造价很高昂。那时,人们认为当时的软件生命期不会超过2000年,为了降低成本,采用了两位十进制数来表示年份,如用“98”表示1998。不幸的是,这种方法在后来几乎成为了一种事实上的行业规范而被沿用,许多芯片、板卡甚至软件多采用这种方法。当2000年到来时,这种表示将产生二义性而导致错误。另外,一些系统的判闰算法不能识别2000年而产生日期表示错误,同样也是产生2000年问题的原因之一。还有的计算机系统把文件的结束标志设为99,当1999年9月9日到来时,系统将停止运行。   当计算机用日期作关键字来进行计算、比较、排序、决定数据保存/舍弃......将造成错误。   无论基于什么理由,在过去的年代里,程序员都是采用两位数格式表示年份。这种表示方法在世纪之交和随后的年代都将导致严重的错误。历史上曾经出现过类似的现象:几乎无人意识到IBM 360系列的机器不能处理1969年12月31日以后的日期,在1969年12月31日当地时间的午夜,全欧洲360系列的机器开始产生运行瘫痪。时间在随着时区进行变化,这种现象开始在全球范围内蔓延。IBM及时认识到这个问题,通知了他们在亚洲和美洲的客户,并提供临时过渡方法,同时着手制造长期性解决问题的补丁包。   遗憾的是并未改变用两位数表示的年份编码格式。2000年问题仍是潜在的陷阱。   Y2K问题发作的日期,2000年1月1日是星期六,非工作日。这将使得未被发现的潜在问题所造成的后果和影响,将直到下一个工作日才能被看到。这就给Y2K问题造成更大影响提供了充足的时间。 #1Y2K问题的定义   简单地定义一下,Y2K问题与以下方面有关:   1. 当计算机操作日期数据时,两位数表示年份法将导致算法、比较、排序、数据库/文件系统的输入/输出以及有关日期操作的失败。一些软件将假定年域的最大值为“99”,并将滚动系统年域的值为“00”,这个值在系统中将被错误地翻译为1900而不是2000,并将导致错误的日期计算。   2. 错误的闰年计算将假设2000年的366天定为365天。这样,日期依赖型算法及与它有参照关系的系统,由于不能正常确定其是否能被400整除,而开始导致运行失败。   3. 软件系统的引用值超出日期范围。   4. 平台的限制。   下面将就这四个方面逐一解释:   ●两位年/六位日期编码   用两位数表示年份的流行编码方式是导致Y2K问题的基本原因。在那些要求用户输入日期的应用中,作为用户输入的结果而未记录正确的世纪信息,导致系统丧失了区别“1900”和“2000”的能力。对于大部分系统而言,这个缺陷在本世纪里并不是引人关注的问题。但是,随着21世纪的临近,正确区别20世纪和21世纪日期的能力,对于系统是否成功,是必然要求。这个问题在六位日期格式中同样存在。六位日期编码格式存在于通常用于管理功能的信息系统中。计划系统、人力资源系统、财务系统、计费系统和许多其它系统采用这种规范。这种编码方式被广泛应用于系统对两个日期前后的确定,或确定一个固定的日期期限是否来临。应用于这种判断的编码大量存在于使用六位日期比较的语句中。   ●正确计算闰年   解决千年问题的另一个因素是对闰年的正确计算。有资料显示,许多人不知道确认闰年的确切规则。事实上,用户针对操作系统运行库例程编写软件运行问题报告时,都发现系统不能正确地判定2000年为闰年。   2000年为闰年。对于公历日期,闰年判断的三项规则如下:   能被4整除的年是闰年;但能被100整除的年不是闰年;除非能被400整除的年是闰年。   因此,根据上述规则,2000年是闰年。   ●软件例程中的硬编码值   问题的第三个方面来源于一些软件例程中的硬编码值。如:“19”被用来表示世纪信息,“99”和“00”被系统作为保留值。这些值被系统认为是永远不可删除的。而正是这些值限制了系统的年代表示范围,导致日期比较的失败和系统输出的混乱。   ●平台的限制   商务成品中的硬/软件部件及软件日期数据,是以一个基本日期的增量存储的。这就可能导致系统的翻转,和由于存储寄存器填充所导致的失效。   如MS早期的操作系统是以4位数字来储存和处理年份的,而且系统时钟也已将2000年视为闰年。如果计算机在世纪交替的午夜时处于工作状态,Microsoft的DOS、Windows3.x、Windows 95、Windows NT 3.x都可正确设置时间和日期。对于无法从1999年12月31日自动过渡到2000年1月1日的计算机系统,如果在那时处于关机状态,那么在2000年1月1日开机后,系统时间将会是1980年1月1日(01-01-1980)。Microsoft的Windows98和Windows NT4.0及以后版本的操作系统可以返回系统的正确日期。 #1Y2K的影响范围   一切计算机系统:主机、工作站、微型机   控制系统:通信系统、交通控制系统、工业控制系统……   网络系统:网络间的数据交换含有日期的信息   嵌入式系统(即含有微处理器的各种设备):收款机、读卡机、票据打印机、各种编号系统和设备、家用电器……   对各行业的影响:   ●对金融系统的危害   全世界的金融系统都已联网,任何地方出问题都可能影响全球金融系统。   金融系统使用很多老计算机系统,软件用老的语言编制、文档不全、厂商不支持、开发人员离去……   ●对交通运输系统影响   美国可能会禁止与那些空中交通管制系统还没有解决2000年问题的国家通航,不在2000年1月1日或其后飞到那些国家去。   美国只有1/3的运输业公司完成了评估,其中只有一半开始进行规划。   引起不安全、不方便和影响JIT系统(实时处理系统)。   预见2000年问题会引起交通运输发生重大的中断。   ●对其他各界的影响   如军事部门、能源部门……   ●两个经常被忽略的问题   一个是嵌入式芯片问题,这些芯片应用于过程控制系统有运算功能的硬件及传感器内。这些芯片安装在工业系统中,例如化工、水、电厂;还有办公用品、家用电器。嵌入式芯片的一大难题是如何找到哪些芯片将受到影响,如何更换,是否有足够的技术支持等等。   另一是Y2K问题出现后所引起的连锁效应亦不容忽视。不单是自己的单位要注意2000年的问题,和你单位上有业务联系的机构如果因2000出现问题而引起原料供应、运输、资金调用上的障碍,可能对你的生产和服务产生影响。 #1Y2K问题的严重性   由于Y2K问题影响到硬件、语言、编译器、操作系统、随机数发生器、安全服务、数据库管理系统、金融系统、程控交换机、电话系统、更多的其它系统和方面,因而Y2K不仅仅是简单的信息系统问题。尽管Y2K问题主要存在于信息系统里,但现实是,任何地方的任何系统,只要它使用日期,就都可能受到影响。另外,单位、团体间通过数据的快速交换和系统间多重接口引出的相互依赖性,更导致计划、测试和协调上的矛盾和问题。   使用新的应用和系统来免除Y2K问题的影响是不现实的。现在距离2000年只有一年多的时间,人们已没有时间研制和开发新的系统,来彻底根除Y2K问题。另外,有的系统没有备份系统、有的系统不可能放在一个2000年兼容环境中进行测试(例如卫星、武器或其它一些无法中断的应用系统),这也给我们解决Y2K问题带来了难度。   尽管Y2K与其它的软件问题有相似之处,但Y2K的一些特性使得它不仅仅是一个标准的维护问题。首先至为重要的一点是,它对所有人都有一个相同的、不可推延的期限。大家同时面临着资源的缺乏,如:程序员和测试人员的不足。其次,它将影响到所有与外部世界有接口的系统。这些系统相互之间将面临一个相同的问题:解决Y2K并使系统投产需要各单位、团体间工作的同步。第三,不同以往的是观念、方法的改变。传统维护的观念是——“问题在这儿,解决它”,而Y2K则变为——“问题在哪儿和如何解决?”。   在下一期,我们将接着讲述“计算机2000年问题的解决之道”。