C++ chrono:以 64 位格式存储和检索日期和时间,以实现 2038 年翻转

问题描述 投票:0回答:1

     2038 年即将到来...我必须考虑 64 位的日期时间!我试图了解如何使用 chrono 库在 C++ 中执行此操作,但到目前为止我失败了。
我必须将日期时间格式传达给设备,该设备将接收 8 个字节来设置其日期,并在请求时返回相同的 8 个字节。
到目前为止我的实验是:
#include <iostream>
#include <chrono>
#include <ratio>
#include <ctime>

using namespace std::chrono;

int main()
{

    typedef std::chrono::duration<int64_t, std::ratio<1,1>> dur_s;
    dur_s time_since_start(0x000000FFFFFFFFFF);
    std::cout << "time_since_start: " << time_since_start.count() << std::endl;

    time_point <system_clock, dur_s> time_point_since_start(time_since_start);
    std::cout << "time_point_since_start: " << 
    time_point_since_start.time_since_epoch().count() << std::endl;

    std::time_t date_since_start = system_clock::to_time_t(time_point_since_start); 

    std::cout << "date_since_start 0: " << date_since_start << std::endl;
    std::cout << "date_since_start 1: " << ctime(&date_since_start) << std::endl;

    return 0;
}

这是输出:

  time_since_start: 1099511627775
  time_point_since_start: 1099511627775
  date_since_start 0: -7293016647
  date_since_start 1: Sun Nov 23 02:52:29 1738

我的意图是创建一个存储在 int64_t 中的 duration,精度为秒(不需要更多分辨率)。由此我想定义一个 time_point 并最终将其表示为 time_t。出于我的目的,我定义了大于 32 位的持续时间,但有些东西不起作用。当我执行 system_clock::to_time_t 时,time_point 被截断,结果是时间上的日期。
我在这里遗漏了一些明显的东西。

我正在 64 位虚拟机上开发最新的 Linux Mint。代码采用标准 C++ 17(如果需要,可以增加到 20)。编译器是 gcc (Ubuntu 13.2.0-23ubuntu4) 13.2.0.
我将感谢您的帮助。

c++ 64-bit c++-chrono time-t year2038
1个回答
0
投票

您的代码看起来正确,只是您的样本时间戳 (

0x0000'00FF'FFFF'FFFF
) 位于 36,812 年。 这可能会让你的
ctime
实现彻底失败。 尝试删除前导
F
:

dur_s time_since_start(0x000'0000F'FFFF'FFFF);

这会让你回到 4147 年。那仍然是遥远的未来,但你的

ctime
更有可能能够处理它。

另外,如果你愿意,你可以替换:

typedef std::chrono::duration<int64_t, std::ratio<1,1>> dur_s;

与:

using dur_s = std::chrono::seconds;

它不会改变任何东西,但你可能会发现它更具可读性。

如果升级到 C++20,您还可以:

std::cout << "date_since_start 2: " << time_point_since_start << '\n';

哪个会输出:

date_since_start 2: 4147-08-20 07:32:15

(与

0x000'0000F'FFFF'FFFF

© www.soinside.com 2019 - 2024. All rights reserved.