__time64_t 解決了 2038 年問題,可是沒解決 1969年問題


花了一天時間,使用 __time64_t 解決了 2038 年的問題。

我以為一切ok,但今天早上無意發現,1969年,使用 __time64_t 無法表示。

先上段代碼:

__time64_t date_time(int year, int month, int day, int hour, int minute, int second)
{
    __time64_t rawtime;
    _time64(&rawtime);
    
    struct tm *timeinfo = _gmtime64(&rawtime);
    //struct tm *timeinfo = _localtime64(&rawtime);

    timeinfo->tm_year = year - 1900;
    timeinfo->tm_mon = month - 1;
    timeinfo->tm_mday = day;
    timeinfo->tm_hour = hour;
    timeinfo->tm_min = minute;
    timeinfo->tm_sec = second;

    __time64_t v = _mktime64(timeinfo);

    return v;
}

 

如果指定 year 為 1969,或者說是 1970 年以前的任意一個年份, _mktime64()  函數直接返回 -1

哎呦,我去!

指定 year 到 2100 年都沒事,卻無法指定到 1969年。

后來網上搜索了一下,看到一篇介紹說,在 linux 下, _mktime64() 能支持到 1900 年開始,但是在 windows 下,_mktime64() 只能支持從 1970 開始。

如果能支持到 1900 年開始,也基本能滿足未來絕大多數的需求場景了。

花了一二個小時也沒找到好的解決方案。

只好改用 double 結合 SYSTEMTIME 和 GetLocalTime()  以及 SystemTimeToVariantTime() ... 來替換所有的 __time64_t  實現。

參考資料:https://docs.microsoft.com/zh-cn/windows/win32/sysinfo/time-functions?redirectedfrom=MSDN

 


免責聲明!

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



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