Windows獲取時間函數(使用GetLocalTime,GetSystemTime,SystemTimeToTzSpecificLocalTime,GetFileTime API函數


獲取本地時間

typedef struct _SYSTEMTIME { WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; WORD wMinute; WORD wSecond; WORD wMilliseconds; } SYSTEMTIME, *PSYSTEMTIME;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

1.GetLocalTime獲取的是本地時區時間

SYSTEMTIME localSysTime;
GetLocalTime(&localSysTime);
  • 1
  • 2

2.GetSystemTime獲取的是UTC時間

SYSTEMTIME utcSysTime;
GetSystemTime(&utcSysTime);
  • 1
  • 2

Note: 
UTC(Universal Time Coordinated),協調世界時,又稱世界標准時間或世界協調時間. 
UTC與格林尼治平均時一樣,都與英國倫敦的本地時相同. 
整個地球分為二十四個時區,每個時區都有自己的本地時間. 
北京時區是東八區,領先UTC八個小時.(UTC+8) 
倫敦時間為UTC+0. 
也就是說,若全球標准時間是2012-07-04 00:00:00,則北京時間為2012-07-04 08:00:00.

3.UTC時間和具體時區時間的轉換

<1> UTC Time –> Local Time

BOOL WINAPI SystemTimeToTzSpecificLocalTime(
  __in LPTIME_ZONE_INFORMATION lpTimeZone, __in LPSYSTEMTIME lpUniversalTime, __out LPSYSTEMTIME lpLocalTime );
  • 1
  • 2
  • 3
  • 4
  • 5

lpTimeZone 
A pointer to a TIME_ZONE_INFORMATION structure that specifies the time zone of interest. 
If lpTimeZone is NULL, the function uses the currently active time zone. 
所以將lpTimeZone設為NULL就會將UTC時間轉換為本地時間

<2> Local Time –> UTC Time

BOOL WINAPI TzSpecificLocalTimeToSystemTime(
  __in LPTIME_ZONE_INFORMATION lpTimeZoneInformation, __in LPSYSTEMTIME lpLocalTime, __out LPSYSTEMTIME lpUniversalTime );
  • 1
  • 2
  • 3
  • 4
  • 5

類同.

File Time

我們在Windows系統中獲取文件的創建時間,存取時間,修改時間可以使用下面的API.

BOOL WINAPI GetFileTime(
  __in HANDLE hFile, __out LPFILETIME lpCreationTime, __out LPFILETIME lpLastAccessTime, __out LPFILETIME lpLastWriteTime );
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

獲取的時間為UTC FILETIME.

typedef struct _FILETIME { DWORD dwLowDateTime; DWORD dwHighDateTime; } FILETIME, *PFILETIME;
  • 1
  • 2
  • 3
  • 4

Contains a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601. 
表示從時間1601-06-01起的100納秒間隔數.

對於時間的顯示,使用SYSTEMTIME為好. 
而對於時間的計算&比較,使用FILETIME為好.

Note:使用GetFileTime獲取的FILETIME為UTC FILETIME.

FILETIME比較函數:

LONG WINAPI CompareFileTime( __in const FILETIME* lpFileTime1, __in const FILETIME* lpFileTime2 );
  • 1
  • 2
  • 3
  • 4

-1— First file time is earlier than second file time. 
0 —- First file time is equal to second file time. 
1 —- First file time is later than second file time.

FILETIME <–> SYSTEMTIME

FileTimeToSystemTime 
SystemTimeToFileTime 
FileTimeToLocalFileTime 
LocalFileTimeToFileTime

對於利用GetFileTime獲取的UTC FILETIME怎樣轉換為Local SYSTEMTIME 
GetFileTime–>UTC FILETIME–>(FileTimeToSystemTime)–>UTC SYSTEMTIME–>(SystemTimeToTzSpecificLocalTime)–>Local SYSTEMTIME 
GetFileTime–>UTC FILETIME–>(FileTimeToLocalFileTime)–>Local FILETIME–>(FileTimeToSystemTime)–>Local SYSTEMTIME

時間間隔的運算

將FILETIME–>LARGE_INTEGER,再通過LARGE_INTEGER進行運算

typedef union _LARGE_INTEGER { struct { DWORD LowPart; LONG HighPart; }; struct { DWORD LowPart; LONG HighPart; } u; LONGLONG QuadPart; } LARGE_INTEGER, *PLARGE_INTEGER;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

eg:

FILETIME time1; FILETIME time2; LARGE_INTEGER liTime1; LARGE_INTEGER liTime2; liTime1.LowPart = time1.dwLowDateTime; liTime1.HighPart = time1.dwHighDateTime; liTime2.LowPart = time2.dwLowDateTime; liTime2.HighPart = time2.dwHighDateTime; LARGE_INTEGER liElapsedTime; liElapsedTime.QuadPart = liTime2.QuadPart - liTime1.QuadPart; liElapsedTime.QuadPart /= 10000000; //相差的秒數
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

時間的轉換公式: 
1微秒 = 1000 納秒 
1毫秒 = 1000 微秒 
1秒 = 1000毫秒

 

http://blog.csdn.net/hisinwang/article/details/45116133


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM