當然,首先要弄清楚FILETIME與SYSTEMTIME定義。
- typedef struct _FILETIME {
- DWORD dwLowDateTime;
- DWORD dwHighDateTime;
- } FILETIME, *PFILETIME;
- typedef struct _SYSTEMTIME {
- WORD wYear;
- WORD wMonth;
- WORD wDayOfWeek;
- WORD wDay;
- WORD wHour;
- WORD wMinute;
- WORD wSecond;
- WORD wMilliseconds;
- } SYSTEMTIME, *PSYSTEMTIME;
比較一下,很明顯,FILETIME與time_t類似,是64位整型,不過FILETIME是以100納秒(ns)為單位。SYSTEMTIME與tm類似,不過多了一項wMilliseconds。可以看出,SDK時間比CRT的時間提供了更高的精度。同時SDK提供了更豐富的函數來處理時間。
- void GetSystemTime(
- LPSYSTEMTIME lpSystemTime);
- void GetLocalTime(
- LPSYSTEMTIME lpSystemTime);
這兩個函數獲得SYSTEMTIME形式的當前時間,不過GetSystemTime函數獲得當前的UTC時間,GetLocalTime獲得當前的本地時間,可以想象,獲得的兩個時間存在着時差。類似於CRT中提供tm與time_t之間的轉換,SDK也提供了兩個函數來轉換SYSTEMTIME時間與FILETIME時間。
- BOOL SystemTimeToFileTime(
- const SYSTEMTIME* lpSystemTime,
- LPFILETIME lpFileTime);
- BOOL FileTimeToSystemTime(
- const FILETIME* lpFileTime,
- LPSYSTEMTIME lpSystemTime);
函數命名很self-explanatory,就不用多說了吧。
SDK還提供了兩個很有趣的函數。
- BOOL LocalFileTimeToFileTime(
- const FILETIME* lpLocalFileTime,
- LPFILETIME lpFileTime);
- BOOL FileTimeToLocalFileTime(
- const FILETIME* lpFileTime,
- LPFILETIME lpLocalFileTime);
LocalFileTimeToFileTime函數將本地的FILETIME時間轉換為對應的UTC的FILETIME時間。我覺得,這個函數只是通過將本地時間減去與UTC時間的時間差來實現轉換,比如在東八區的本地時間轉換為對應的UTC時間,只需要將本地時間減去8*60*60*1000*1000*10(單位100ns)。類似,FileTimeToLocalFileTime函數是將UTC時間轉換為本地時間,它只是將減去時間差換成加上時間差。
了解了這些功能,讓我們用代碼說話吧。
- #include <stdlib.h>
- #include <stdio.h>
- #include <time.h>
- #include <windows.h>
- int main()
- {
- SYSTEMTIME stLocal, stUTC, stUTC2;
- FILETIME ftLocal, ftUTC, ft;
- ULARGE_INTEGER uli;
- GetLocalTime(&stLocal);
- GetSystemTime(&stUTC);
- printf("Local System Time(YYYY-MM-DD HH:MM:SS): %d-%d-%d %d:%d:%d/n", stLocal.wYear, stLocal.wMonth,
- stLocal.wDay, stLocal.wHour, stLocal.wMinute, stLocal.wSecond);
- printf("UTC System Time (YYYY-MM-DD HH:MM:SS): %d-%d-%d %d:%d:%d/n", stUTC.wYear, stUTC.wMonth,
- stUTC.wDay, stUTC.wHour, stUTC.wMinute, stUTC.wSecond);
- SystemTimeToFileTime(&stLocal, &ftLocal);
- uli.LowPart = ftLocal.dwLowDateTime;
- uli.HighPart = ftLocal.dwHighDateTime;
- printf("Local File Time: %llu/n", uli.QuadPart);
- LocalFileTimeToFileTime(&ftLocal, &ftUTC);
- uli.LowPart = ftUTC.dwLowDateTime;
- uli.HighPart = ftUTC.dwHighDateTime;
- printf("UTC File Time: %llu/n", uli.QuadPart);
- FileTimeToSystemTime(&ftUTC, &stUTC2);
- printf("UTC System Time2 (YYYY-MM-DD HH:MM:SS): %d-%d-%d %d:%d:%d/n", stUTC2.wYear, stUTC2.wMonth,
- stUTC2.wDay, stUTC2.wHour, stUTC2.wMinute, stUTC2.wSecond);
- return EXIT_SUCCESS;
- }
程序輸出結果如下:

代碼13行GetLocalTime函數獲得當前的本地SYSTEMTIME時間,14行獲得對應的UTC的SYSTEMTIME時間,如輸出結果前兩行所顯示,兩者相差8小時(凌晨還在寫博客,表揚下自己。。。)。
20行SystemTimeToFileTime函數將本地SYSTEMTIME時間轉換為方便計算的本地FILETIME形式時間,如輸出結果第三行所顯示。
25行LocalFileTimeToFileTime函數將本地FileTime時間轉換為對應的UTC的FILETIME時間,如輸出結果第四行所顯示。就像前面介紹的,如果你將輸出結果第三,四兩行所顯示的數字相減,並除以10*1000*1000*60*60,你將會得出8,你可以算下試試,記住FILETIME是以100納秒為單位的。
最后30行FileTimeToSystemTime將FILETIME時間轉換為SYSTEMTIME時間。可以看出輸出結果中第五行與第二行相同,這是必須的,因為兩者都是當前本地時間對應的UTC時間。
納秒與秒的換算關系:
1000納秒=1微秒
1000微秒=1毫秒
1000毫秒=1秒
