首页  编辑  

WIN9X中读取时钟函数的纠正

Tags: /超级猛料/Date.Time.时间和日期/   Date Created:

]、。·ˉˇ¨〃々—~‖…’”〕〉》」』〗】∶!"'),.:;?]` WIN9X中读取时钟函数的重大错误(1999.08.16)

  在编写Y2K测试程序时我们使用GetLocalTime来读取当前时间,意外地发现在WIN95,WIN98中当一天的23:59:59过渡到第二天的零点时,GetLocalTime可能会返回错误的日期,错误的日期和时间表明又回到了一天的开始。虽然这是一个小概率事件,但对于需要24小时不间断运行的时间关键性应用却是不可忽视的错误。

   分析WIN9X可知GetLocalTime仅使用两次DOS调用分别取日期和时间,没有做必要的校验,若正好在两次DOS调用间发生日期过渡就将出现GetLocalTime返回的日期为前一天的错误。

  经我们测试GetSystemTime在WINNT4下没有类似问题。在Microsoft更正前可用下面的代码避免WIN9X可能出现的错误:

DELPHI:

procedure MyGetLocalTime(var LocalTime:TSYSTEMTIME);

begin

   GetLocalTime(LocalTime);

   if (LocalTime.wHour+LocalTime.wMinute+LocalTime.wSecond)=0 then

         GetLocalTime(LocalTime);

end;

C:

void MyGetLocalTime(LPSYSTEMTIME lpSystemTime)

{

 GetLocalTime(lpSystemTime);

if (lpSystemTime->wHour+lpSystemTime->wMinute+lpSystemTime->wSecond)=0    

   then

GetLocalTime(lpSystemTime);

}