在開發(fā)應(yīng)用程序時往往需要獲取當(dāng)前系統(tǒng)時間。盡管Y2K似乎已經(jīng)平安過去,但在我們新開發(fā)的應(yīng)用程序中還是要謹(jǐn)慎處理“時間”問題。
在《融會貫通--Delphi4.0實戰(zhàn)技巧》(以下簡稱“該書”)第89頁專門介紹了兩種獲取當(dāng)前系統(tǒng)時間的方法,但這兩種方法都存在不足或錯誤,以下就此進行討論。
該書第一種方法是利用Time()函數(shù)獲得當(dāng)前系統(tǒng)時間,返回結(jié)果是TDateTime結(jié)構(gòu)類型的變量。例如:
PRocedure TForm1.Button2Click(Sender: TObject);
var
DateTime:TDateTime;
begin
DateTime:=Time();
Caption:=DateToStr(DateTime)+' '+TimeToStr(DateTime);
end;
但不論何日期,其結(jié)果卻都是99-12-30 xx:xx:xx, 顯然日期出錯了。通過分析Delphi的幫助,Time()用于返回正確的“時間--時分秒”即TimeToStr(DateTime),而不應(yīng)該用于返回“日期”。事實上,單獨用于返回日期的系統(tǒng)函數(shù)是Date。
那么有什么是既可返回正確的“時分秒”又可返回正確的“年月日”呢? 可以用Now函數(shù),例如:
procedure TForm1.Button1Click(Sender: TObject);
var
mytime: TDateTime;
begin
mytime:=Now;
Caption:=DateToStr(mytime)+' '+TimeToStr(mytime);
//或直接用 Caption := DateTimeToStr(Now);
end;
用Now返回的日期格式中年只有2位,即2000年顯示為00, 這似乎不太令人滿意. 此外Now和Time都只能獲得精確到秒的時間,為了得到更精確的毫秒級時間,可以使用API函數(shù)GetSystemTime,它對應(yīng)的TSystemTime類型的定義為:
TSystemTime = record
wYear: Word;
wMonth: Word;
wDayOfWeek: Word;
wDay: Word;
wHour: Word;
wMinute: Word;
wSecond: Word;
wMilliseconds: Word;
end;
顯然,在程序邏輯中還能夠方便地使用其結(jié)構(gòu)成?時---各類時間值,因此使用函數(shù)GetSystemTime具有很大優(yōu)越性。但該書中該函數(shù)的用法是錯誤的,通過查閱Windows SDK幫助可知,該函數(shù)原型為:
VOID GetSystemTime(LPSYSTEMTIME lpst),參數(shù)指針lpst獲取系統(tǒng)時間,因此可如以下程序段實現(xiàn):
procedure TForm1.Button3Click(Sender: TObject);
var
SysTime: TsystemTime;
begin
GetSystemTime(SysTime);
Caption:=IntToStr(SysTime.wYear)+' '+IntToStr(SysTime.wMonth);
//if SysTime.wYear>2000 then
// ......在程序邏輯中利用獲取的各類時間值
end;
綜合以上討論,獲取當(dāng)前系統(tǒng)時間利用函數(shù)GetSystemTime比較方便而且靈活。
新聞熱點
疑難解答
圖片精選