说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

在Delphi中避免2000年问题的捷径

HTML文档下载 WORD文档下载 PDF文档下载
在Delphi中避免2000年问题的捷径

---- 众所周知

对于应用软件而言千年虫主要是指2000年跨越问题。也就是当我们采用两位数的省略形式表示年份

在进入2000年时

由于可能将00年理解成1900年,从而引起的日期表达、运算、输出等方面的严重差错,其实大多数操作系统及应用系统在内部格式上都有充分的日期表示范围的

通常都能表示1900-9999年的日期

就连DOS的文件日期中采用可怜的7位二进制数

也能表示1980-2099。所以真正引起众多问题的原因是在于人们习惯于使用两位数年份格式来进行输入、显示甚至运算、比较等

从而引起了世纪跨越时的种种问题。

---- 由于多数语言及数据库系统都支持完整年份的日期表示法。所以解决办法之一是系统中避免使用缩写年份表示法(即2位数年份)。但是对于已经使用的系统来说, 许多系统可能对日期的宽度格式做了既定的统一的规划, 大批量地修改扩充位数显然是一项极为耗时耗力的工作,而且往往顾此失彼,很难不出差错, 所以这并不是一个最佳解决办法。再说在日常生活中人们总是习惯于避繁就简,使用简略的纪年称呼。我相信到了明年后年,人们一定又很习惯地称呼本年为00年、01年。

---- 基于上述两点理由, 我们又不可否认采用两位数年份格式的实际意义。所以保留2位数年份表示法,并寻求避免千年虫的方法, 将有更大的意义。 我们知道,两位数的年份(00-99),只能表示一百年的日期,超过范围则必定引起二义性。通常系统将它约定为1900-1999年,这样自然就无法表示2000年了。如果我们将00-99约定为1930-2029年,也就是对映射的时间窗作一定的移动, 那么对于多数应用都能完全满足纪年的需要,而且不需要改动数据储存和输入输出的格式。

---- 为了实现这一时间窗的移动, 多数系统必须人工干预, 也就是必须在输入或转换2位数年份时强制映射到约定的时间窗中。

---- 那么,有没有更为简捷的解决办法呢?

---- 打开windows98的控制面板中区域设置, 在日期选项卡中有几个参数和2000年跨越有密切相关,一是短日期格式,可以是yy-M-d或yyyy-MM-dd等,它决定系统日期的显示格式。一是两位数年份的变换时间窗,我们可以设为1930-2029.

---- 经过这样设定后回到Delphi中观察,我们发现日期显示是变为4位年份格式。但是当您试着在日期栏中输入'00-1-1'会发现,系统依然变换为1900年1月1日. 问题仍未解决。

---- 经过不断研究,我们找到了答案。原来在Delphi中同样有个时间窗定义变量TwoDigitYearCenturyWindow。比如将它设为60,它的含义就是将今年的年份前溯60年作为时间窗起点,也就是变换时间窗为1939-2038。这样一来问题就彻底解决了。

---- 值得一提的还有另外一个变量ShortDateFormat

作为新开发的系统,最好设为'yyyy-MM-dd'

这样系统就不依赖于windows系统设置的格式,而且统一为整齐的10位宽度,这时既可输入4位数年份又可方便输入两位数年份, 让系统根据时间窗来自动转换。当然对于某些特殊应用中年份可能出现超出时间窗范围的日期,那就一定得完整输入了,就算不小心输成2位数形式,也能立即从系统转换出来的4位年份中看出错误,而得到及时纠正!

---- 综上所述

在已开发的老系统中

可在程序开始处加入以下几行

再用Delphi4.0重新编译,即可消除通常的2000年问题!

DateSeparator := '-';

ShortDateFormat:='yy-mm-dd';

TwoDigitYearCenturyWindow:=80;

---- 对于新开发的系统,最好在程序开始处加入:

DateSeparator := '-';

ShortDateFormat:='yyyy-mm-dd';

TwoDigitYearCenturyWindow:=70;

---- 如此简单的几句, 一定会为您换来无穷的效益!

备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘