#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.
我将感谢您的帮助。
您的代码看起来正确,只是您的样本时间戳 (
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
)