C++中各種時間類型的轉換(包括MFC中的時間類型)


平時寫代碼會經常遇到時間類型轉換的問題,如時間戳轉為格式化時間,或者反過來等,時間類型有的為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 

https://blog.csdn.net/leechiyang/article/details/39529041

https://blog.csdn.net/baggiowangyu/article/details/6267456


免責聲明!

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



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