精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>已关闭版区>>● 千年虫>>检测过程>>解决2000年问题有哪些具体的修改方法?

主题:解决2000年问题有哪些具体的修改方法?
发信人: likaiwpf()
整理人: majorsun(1999-04-09 08:28:19), 站内信件
解决2000年问题有哪些具体的修改方法?  

 
        目前常用的修改日期的方法有以下三种:  
 
1). 扩大表示日期的位数 
        产生2000年问题的根本原因是由于使用两位数来存储年份信息。因此,解
决 
2000年问题显而易见的办法是将所有表示年代的位数由二位扩大到四位数,同时将
那 
些需要对年代进行计算和比较的位数也 扩大。此外,接口界面部分也要做相应的
修改。 
总的来说,与下面所介绍的两种方法相比较, 扩大表示日期的位数是最彻底、最根
本、 
最明显的办法。 
        尽管扩大表示日期的位数是最彻底的解决办法,现在新开发的程序和系统
都 
采用这种方案 ,但是,这给工作环境复杂的公司出了一个很大的难题。例如,两个
不同 
的应用程序从同一数 据库中提取数据,而数据库中表示年代的数据结构已改为四
位数, 
在这种情况下,这两个应用 程序必须同步进行修改,以适应四位数的年代表示。因
此, 
就需要编写一个中介程序(或称桥 接程序)来完成两位数到四位数之间的自动转换
。 
一旦转换完成,立即取消中介程序。整个过 程包括编写转换程序、测试、取消转
换程 
序、再测试。这种方法需要使所有的转换同步进行 。比较起来,这是资源投入较
多、 
时间和财力花费最大的方法,但对于应用程序数量少,规模小,计算机化程度还
不是 
很高的单位来说,这又是一种最可行的解决办法。 
 
2). 窗口法 
        又称作"70/30"、"80/20"法,或日期重译法。如"70/30"表示:任何大于7
0的数 
字都为20世纪,小于70的数字为21世纪。使用这种办法不用改动数据,只需改动源
码。程 
序 中凡是用年代进行比较计算时,都应将源码做相应的改动。例如日期01/01/0
1和 
01/01/99,在程序未经修改时,系统将其解释为01/01/1901和01/01/1999,如果在
这种情 
况下计算 利息,那么,就会计算出1998年的利息。但在采用窗口法的系统中,这两
组数表 
示的日期 分别为01/01/2001和01/01/1999。  
        窗口法中,由于每个程序都是单独修改,因此,无需使用"造桥"术来解决
相互间 
的协 调问题,相对来说,动用和花费的资源较少。其缺点在于,窗口的大小小于10
0年。 
另外,每一个带有日期域的程序都要改动。由于改动量大,测试的范围也相应增大
。但这 
种方式对用户接口并无大的影响,可以人为地对报告或屏幕数据进行翻译。 对于
工作环 
境复杂,应用程序数量多、规模大而且计算机化程度高的单位来说,这是推荐的
解决办法, 
据介绍,国外绝大多数规模较大的公司和企业在2000年问题工程实施中都采用这
种办法。 
 
3). 推后法 
        推后法,指在现存的日期位数中固定加上某一年数,把2000年问题推后解
决。就 
其效果来说,对那些电脑系统已经面临2000年问题的公司是最好的办法。例如,
日期 
01/01/99、01/01/00和01/01/01,将其所有年代数据后都加上80,则分别为01/0
1/79、 
01/01/80和01/01/81,即将2000年问题推后20年。虽然日期中的年份数据不符合
实际,但 
是,对于基于日期分类和比较的运算仍可进行。  
        推后法虽有效地使用了日期域现有的存储,但增加了系统的复杂性,实
现也比较 
困难 。首先要确定增加的数目,因为并不是所有的情况加上80都合适。此外,该
方法也 
存在同步配合问题,需要运行临时转换程序,得出的数据也需要重译。如读到01
/01/79、 
01/01/80和01/01/81时应解释为01/01/1999、01/01/2000和01/01/2001。 
 
4). 日期压缩法 
        大家知道,目前用两位数来表示年份的做法实际上是用两个字节来表示
年份信息, 
也就是说,虽然每个字节最大可以表示到15(1111),但我们只使用到其中的9,
那么通过 
一种压缩算法,可以将2000年在19XX中表示出来,其中19为十进制,XX为16进制
,这样19XX 
最大可以表示为(1900+255),2000年问题也就解决了。这种做法的好处是不用
扩大表示年 
份的位数,缺点是程序编写起来非常复杂,在2000年前把应用系统全部修改完成
恐怕时间不 
够。  
 
 

--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.32.150]

[关闭][返回]