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

  • 相关阅读:
    camke中关于变量的一些知识
    ububtu16.04下安装protobuf
    ububtu下安装配置搜狗输入法
    anaconda资源链接
    把本地项目文件上传到github远程仓库的教程
    cmake practice一文中安装可执行文件的方法
    slam学习资源
    js中对String去空格
    去当前时间的周一
    对sql初始化的值的处理
  • 原文地址:https://www.cnblogs.com/personnel/p/13955548.html
Copyright © 2011-2022 走看看