先介紹一個可能比較常用的方法,獲取當前時間
var datetime: string; begin datetime:= FormatDateTime('yyyy-mm-dd hh:mm:ss', Now); ShowMessage(datetime); end;
其中的Now 函數是獲取當前的時間,FormatDateTime 用於將Now獲取的時間信息格式化為想要的格式。
這個方法可以獲取當前時間,並且格式化為例如 2008-09-10 09:10:58 的格式。
在介紹能夠獲取毫秒信息的方法
var currentTime:TSystemTime; year, month, day, hour, minute, second, millisecond: string; datetime: string; begin GetSystemTime(currentTime); year:= IntToStr(currentTime.wYear); month:= IntToStr(currentTime.wMonth); day:= IntToStr(currentTime.wDay); hour:= IntToStr(currentTime.wHour + 8); minute:= IntToStr(currentTime.wMinute); second:= IntToStr(currentTime.wSecond); millisecond:= IntToStr(currentTime.wMilliseconds); datetime:= year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second + ':' + millisecond; ShowMessage(datetime); end;
時間的小時數問題
和C家族的語言(比如C、C++、PHP)一樣,這種方式獲取的時間,年、月、日、分鍾、秒、毫秒都是,但是獲取的小時數是晚了8小時的,比如當前時間是19:30,但是使用這種方法得到的小時數是11點,所以在進行開發的時候,這個問題需要單獨處理一下。
這也是為什么上面的代碼中小時數會加8的原因:hour:= IntToStr(currentTime.wHour + 8);
需要引入的單元
要使用TSystemTime類型以及GetSystemTime過程需要引用Windows單元。
其中TSystemTime的定義是
PSystemTime = ^TSystemTime; _SYSTEMTIME = record wYear: Word; wMonth: Word; wDayOfWeek: Word; wDay: Word; wHour: Word; wMinute: Word; wSecond: Word; wMilliseconds: Word; end; {$EXTERNALSYM _SYSTEMTIME} TSystemTime = _SYSTEMTIME; SYSTEMTIME = _SYSTEMTIME; {$EXTERNALSYM SYSTEMTIME}
其中GetSystemTime的聲明是這樣的
procedure GetSystemTime; external kernel32 name 'GetSystemTime';
它的函數原型是
procedure GetSystemTime(var lpSystemTime: TSystemTime); stdcall;
一看就是使用靜態加載的方式加載了DLL,所以在Windows里面也只是引入GetSystemTime過程,並沒有實現,具體的實現是在 kernel32.dll這個DLL里面實現的。具體這個DLL是使用C語言還是使用Delphi語言實現的就不得而知了,等我以后研究到再說。(估計是用C實現的,要不為什么獲取的時間的小時數會差8個小時,和C語言一樣,不過這只是目前的猜測)
什么是kernel32.dll?
kernel32.dll是Windows 9x/Me中非常重要的32位動態鏈接庫文件,屬於內核級文件。它控制着系統的內存管理、數據的輸入輸出操作和中斷處理,當Windows啟動時,kernel32.dll就駐留在內存中特定的寫保護區域,使別的程序無法占用這個內存區域。