c++ - time_t boost 日期转换给出不正确的结果

标签 c++ boost year2038

我有一组 unix 时间戳,我正在转换为 boost (1.65.1) 日期,但是当它们在未来太远时,转换似乎会中断。 2040 年左右及以后的任何事情似乎都以某种方式回到了 1900 年后。

给定以下代码...

        {
            std::time_t t = 1558220400;
            boost::gregorian::date date = boost::posix_time::from_time_t(t).date();
            std::cout << "Date: " << date << std::endl;
        }

        {
            std::time_t t = 2145500000;
            boost::gregorian::date date = boost::posix_time::from_time_t(t).date();
            std::cout << "Date: " << date << std::endl;
        }

        {
            std::time_t t = 2500000000;
            boost::gregorian::date date = boost::posix_time::from_time_t(t).date();
            std::cout << "Date: " << date << std::endl;
        }

...我得到以下输出...

    Date: 2019-May-18
    Date: 2037-Dec-27
    Date: 1913-Feb-13

...但是我期待以下输出...

Expected output:
    Date: 2019-May-18
    Date: 2037-Dec-27
    Date: 2049-Mar-22

我这里有什么地方做错了吗?

最佳答案

您似乎遇到了 2038 年问题。

32 位有符号整数可以表示的最大数是 2'147'483'647。自 1970 年 1 月 1 日 00:00:00 UTC(UNIX 纪元)以来的 2'147'483'647 秒是 2038 年 1 月 19 日 03:14:07 UTC。之后的任何 UNIX 时间都无法使用 32 位签名整数。

要么系统上的std::time_t是32位的,要么在boost库里面转成32位的。从source可以看出boost 使用 static_cast 将输入转换为 long(并且在版本 1.70 中仍然如此)。 long 例如在 Windows 上是 32 位,甚至在 64 位架构上也是如此。它在许多其他系统(例如 64 位 Linux)上是 64 位的。

关于c++ - time_t boost 日期转换给出不正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56223364/

相关文章:

c++ - strlen 函数总是返回 0

c++ - 最低有效字节是什么意思?

sql-server - 将 Epoch 转换为 DateTime SQL Server(超过 2038 年)

java - 为什么 Java 程序员应该关心 2038 年的错误?

c++ - 如何在 C++ 中强制使用奇怪的重复模板模式

c++ - 需要列表设计(面向对象)建议

C++ boost函数重载模板

c++ - boost 返回 0 的 CPU 时间

c++ - 警告在 WDK 构建 ("LNK4217: locally defined symbol _ imported in function _"中链接 boost 库)

php - 为什么时间戳的限制是2038?