filetime和systime的轉換(相差8小時)(8字節,64位時間格式解析和顯示)

博主做項目時,發現一個8字節時間,也就是64位{0x97,0x31,0x4F,0x14,0x5D,0x59,0xD5,0x01}(即0x01D5595D144F3197)的時間需要轉換。經過查找發現,這個8字節的時間是filetime格式,並且是按大端序排列的,我們家用Windows7/8/10 64位系統一般是小端序。下面是具體的解決方案。

首先將八字節的時間轉化爲整形int,也就是先轉化爲秒數。然後再將秒數轉化爲日期和時間。

1.1將八字節時間轉化爲整形

因爲filetime格式是64位無符號整形quint64,並且單位是100ns(100納秒)。所以轉化爲整形後,就可以轉爲秒數,即從格林威治時間1601年1月1日0時開始計時的秒數。

比如秒數爲50秒,則表示當前時間爲1601-01-01 00:00:00 + 00:00:50 == 1601-01-01 00:00:50

1.2將filetime轉化爲systime

上面將八字節轉化爲了64位無符號整形,也即是一個filetime時間,如果我們要顯示,則可以轉化爲systime時間進行顯示。filetime轉化爲systime可以調用系統函數FileTimeToSystemTime(*pFileTime,*pSystemTime);轉化後,可以調用systemtime靈活顯示年、月、日、時、分、秒。因爲filetime轉化爲systemtime相差8小時,這是由於區時誤差造成的,只需要轉化後,將systemtime的小時那裏加一個8小時,然後取24的餘數即可。

下面是一個具體的示範代碼。

1.3具體實例代碼如下

    const BYTE byteArr[]={0x97,0x31,0x4F,0x14,0x5D,0x59,0xD5,0x01};
/*    quint64 timeCount=0;    
    memcpy(&timeCount,byteArr,8);
    timeCount/=10000000;   //單位是秒s */
    FILETIME ft;
//    GetSystemTimeAsFileTime(&ft); //獲取系統時間,win32 api
    memcpy(&ft.dwLowDateTime,&byteArr[0],4);
    memcpy(&ft.dwHighDateTime,&byteArr[4],4);
    SYSTEMTIME st;
    FileTimeToSystemTime(&ft,&st);      //filetime和systime相差8小時;即systime+8h=filetime
/*    qDebug()<<tr("%1s").arg(timeCount); */
    str.sprintf("%4d-%02d-%02d  %02d:%02d:%02d",st.wYear,st.wMonth,st.wDay,(st.wHour+8)%24,st.wMinute,st.wSecond);
//    qDebug("%4d-%02d-%02d  %02d:%02d:%02d",st.wYear,st.wMonth,st.wDay,(st.wHour+8)%24,st.wMinute,st.wSecond);
    qDebug()<<str;

 

封裝成函數和調用代碼如下

//封裝函數
SYSTEMTIME parseFileTime(const BYTE *byteArr,const quint8 num=8)
{
    SYSTEMTIME st;
    if(num!=8)
    {
        qDebug()<<"輸入不是標準filetime格式時間!";
        return st;
    }
    FILETIME ft;
    memcpy(&ft.dwLowDateTime,&byteArr[0],num/2);
    memcpy(&ft.dwHighDateTime,&byteArr[4],num/2);

    FileTimeToSystemTime(&ft,&st);      //filetime和systime相差8小時;即systime+8h=filetime
    return st;
}


//調用代碼
const BYTE byteArr[]={0x97,0x31,0x4F,0x14,0x5D,0x59,0xD5,0x01};
SYSTEMTIME st=parseFileTime(byteArr);
qDebug("%4d-%02d-%02d  %02d:%02d:%02d",st.wYear,st.wMonth,st.wDay,(st.wHour+8)%24,st.wMinute,st.wSecond);

 

1.4總結

由上面結果可知,上面8個字節的大端序時間轉化爲日期時間爲2019-08-23 10:47:18。

所以,一個8字節的時間格式的轉化如下:

先轉化成無符號64位整形的filetime格式,然後轉化爲systemtime,最後用systemtime顯示。

 

 

參考內容:

https://blog.csdn.net/haiross/article/details/45720041(參考:filetime轉systemtime)

https://www.cnblogs.com/FCoding/archive/2012/11/13/2767607.html(參考:filetime格林威治時間,從1601年開始)

https://www.cnblogs.com/singlebutterfly/p/4662480.html(參考:qDebug()打印兩位數前面不足補零)

https://unixtime.51240.com/(參考:時間戳轉換,從1970年開始)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章