平時寫代碼會經常遇到時間類型轉換的問題,如時間戳轉為格式化時間,或者反過來等,時間類型有的為time_t,還有FILETIME一堆,在這里記錄下他們之間是如何轉換的。
時間類型及其意義
FILETIME:結構持有的64位無符號的文件的日期和時間值。此值表示自UTC(Coordinated Universal Time)時間1601年1月1日開始的100納秒為單位的時間。
SYSTEMTIME:這個和tm有點類似,代表系統時間。其中,SYSTEMTIME.year的值為多少就表示公元哪一年。
tm:Systemtime-1900得到tm.year,其他的還有些差別 tm.year的值加上1900才表示公元哪一年。
time_t:是日歷時間;其值表示從UTC(Coordinated Universal Time)時間1970年1月1日00:00:00(稱為UNIX系統的Epoch時間) 到當前時刻的秒數。
各種轉換
- MFC時間控件轉為CTime類型
- CTime類型轉為時間戳(__int64)
- CTime轉為SYSTEMTIME類型
- SYSTEMTIME類型轉為FILETIME類型
- FILETIME轉為時間戳(__int64)
- 時間戳轉為FILETIME類型
MFC時間控件轉為CTime類型
static CTime DataTimeCtrl2CTime(CDateTimeCtrl const& data,CDateTimeCtrl const& time) { CTime tData,tTime; data.GetTime(tData); time.GetTime(tTime); return CTime(tData.GetYear(),tData.GetMonth(),tData.GetDay(),tTime.GetHour(),tTime.GetMinute(),tTime.GetSecond()); }
CTime類型轉為時間戳(__int64)
static __int64 CTime2TimeStamp(CTime const& ctime) { return ctime.GetTime(); }
CTime轉為SYSTEMTIME類型
static SYSTEMTIME CTime2Systemtime(CTime const& ctime) { SYSTEMTIME st; ctime.GetAsSystemTime(st); return st; }
SYSTEMTIME類型轉為FILETIME類型
static FILETIME SystemTime2FileTime(SYSTEMTIME const& sysTime) { FILETIME filetime; ::SystemTimeToFileTime(&sysTime,&filetime); return filetime; }
FILETIME轉為時間戳(__int64)
第一種方法:
#define EPOCH_DIFF 116444736000000000 #define RATE_DIFF 10000000 #define TIME_DIFF 8*60*60 static TIME64_MS FileTime2TimeStamp(FILETIME const& filetime) { return ((static_cast<__int64>(filetime.dwHighDateTime)<<32| filetime.dwLowDateTime)-EPOCH_DIFF)/RATE_DIFF - TIME_DIFF; }
第二種方法:
static TIME64_MS FileTime2TimeStamp2(FILETIME const& filetime) { ULARGE_INTEGER ularge; ularge.LowPart = filetime.dwLowDateTime; ularge.HighPart = filetime.dwHighDateTime; return (ularge.QuadPart - EPOCH_DIFF)/RATE_DIFF - TIME_DIFF; }
時間戳轉為FILETIME類型
#define EPOCH_DIFF 116444736000000000 #define RATE_DIFF 10000000 #define TIME_DIFF 8*60*60 //8小時時差 static FILETIME TimeStamp2FileTime(TIME64_MS const& ts) { TIME64_MS tmpTs = (ts+ TIME_DIFF) * RATE_DIFF + EPOCH_DIFF; FILETIME ft; ft.dwLowDateTime = (DWORD)tmpTs; ft.dwHighDateTime = tmpTs >> 32; return ft; }
小結
暫時用到這么多。
參考
https://blog.csdn.net/haiross/article/details/45718743