平时写代码会经常遇到时间类型转换的问题,如时间戳转为格式化时间,或者反过来等,时间类型有的为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)<<| 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 >> ;
return ft;
}
小结
暂时用到这么多。
参考
https://blog.****.net/haiross/article/details/45718743