zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    [APIO2007]风铃
    [APIO2011]方格染色
    [APIO2016]烟火表演
    [APIO2013]机器人
    [APIO2015]巴厘岛的雕塑
    [APIO2015]八邻旁之桥
    [APIO2010]特别行动队
    [APIO2015]雅加达的摩天楼
    WC2019游记
    退役前的做题记录3.0
  • 原文地址:https://www.cnblogs.com/huangsitao/p/10283623.html
Copyright © 2011-2022 走看看