荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Peter (小飞侠), 信区: Program
标  题: Visual Basic也存在2000年问题
发信站: BBS 荔园晨风站 (Thu Jan 21 23:10:12 1999), 转信


   Visual Basic(以下简称VB)以其灵活易学的特点成为目前Windows
开发的主要工具,可你想到没有,当世纪钟声敲响之时,你的VB程序会
怎样呢?
    笔者研究的结果说明VB的2000年问题比较复杂,因版本而异,现简
要说明如下。
    为了考察VB的2000年问题,笔者编写了如下这段程序:
    Dim sDate As String
    Dim vDate As Variant
    sDate = "Jan 1 01"
    vDate = CVDate(sDate)
    Debug.Print "Now = " & Now
    Debug.Print "sDate = " & Format$(sDate, "dd/mm/yyyy")
    Debug.Print "vDate = " & Format$(vDate, "dd/mm/yyyy")
    把这段程序在每个版本的VB运行两次,第一次运行系统时间采用
本世纪的时间1997年8月9日,另一次使用下世纪的时间2000年8月9日
。完成整个测试之后,得出如下结果。
    在VB 3.0中,两次结果如下:
    Now = 97/08/09 3:06:48 PM
    sDate = 01/01/1901
    vDate = 01/01/1901
    Now = 2000/08/09 3:08:11 PM
    sDate = 01/01/1901
    vDate = 01/01/1901
    从结果中我们可以看出,由于VB3.0发行得比较早,当时2000年问
题还没有引起人们的注意,所以VB 3.0把任何年份都看成本世纪的。
也就是说,可能会出现这样的情况:你的程序在下世纪会突然使时光倒
流100年。在测试中还发现Format函数和Year函数返回的结果是一样
的,这说明在VB 3.0中只存在一种计算世纪的方法。
    VB 4.0中的情况比3.0版复杂多了。首先看看16位版本。下面是
测试的结果:
    Now = 97/08/09 3:06:48 PM
    sDate = 01/01/1901
    vDate = 01/01/1901
    Now = 2000/08/09 3:08:11 PM
    sDate = 01/01/2001
    vDate = 01/01/2001
    VB 4.0的16位是根据当前系统日期来判断世纪的。若当前年份为
1997,得到的日期为2世纪的,若当前年份为2000年,得到的日期为21世
纪的。这也可能会出现问题,当在2000年处理1999年的帐目时,VB会认
为那是2099年的。
    VB 4.0的32位版本,得到的结果可能与16位版本相同,也可能不同
。这是因为VB 4.0的2 位版本的日期函数(除DateSerial函数以外)是
从OleAut32.dll得到世纪数据的。VB 4.0的3 2位版本自身带的是2.1
0版本,它采用的方法同VB 4.0的16位版本一样。而在VB 4.0发行后,
微软也意识到它处理世纪的方法不够合理,所以在随后发行的2.20版
和此后的版本中采用了新的方法。新方法认为,如果年份的后两位在3
0至99之间,则认为是20世纪,而若在00至29之间,就认为是21世纪。这
可以比较好地解决世纪末过渡时期的世纪问题,至于2030年及以后怎
么办,只能到时候再说了。微软1996年以后推出的软件中包括的OleAu
t32.dll都是采用此方法,这些软件包括Internet Explorer 3.0、Win
dows NT 3.51 Service Pack 5、WindowsT 4.0、Windows 95 OSR 2(
俗称Windows 96)、Office 97和Visual Studio 97等等。VB 50也采
用此方法。如果用户在VB 4.0的32位版本中运行前面的测试程序得到
的结果同16位版本相同,说明该OleAut32.dll是老版本,否则为新版本
。可见,VB 4.0的32位版本得到的结果取决于OleAut32.dll 的版本。
需要说明的是,DateSerial函数不是从OleAut32.dll得到世纪数据的,
它在VB的16位和32位版本中采用的方法是一样的。
    以上是VB各个版本对世纪问题的处理方法。如果程序与日期函数
有关,笔者建议采用自定义函数来确定世纪。比如,认为80年至99年的
日期都是本世纪,而00年至79年为下世纪。可以编写如下的程序来返
回四位年份。
    Sub MyYear( vDate As Variant) As String
    Dim s As String
    If Format$( vDate, "yy") < "80" Then
      s = "20"
    Else
      s = "19"
      End If
      MyYear = s + Format$( vDate, "yy")
    End Sub
    现在,你应该逐个审核你的程序,不要让它们在2000年元旦的节日
里给你添麻烦
--

--
※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.1.3]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店