C++:如何从 json 获取长值并将其转换为 time_point

C++ : how to get a long value from json and convert it to time_point

我是 c++ 的新手,所以我遇到了一堆问题,但现在这个问题让我抓狂:

我有一个 json 响应并希望尽可能长地解析一个对象(因为它是一个时间戳)。之后,我希望 tp 通过

将那么长的时间解析为 time_point 对象
chrono::system_clock::from_time_t(...);

这就是我现在得到的:

auto last_change_date_long = (long long)json_troubleticket["lastChangeDate"].int_value();
time_t last_change_date_raw = time_t(last_change_date_long);
auto last_change_date = chrono::system_clock::from_time_t(last_change_date_raw);

它编译,但是如果我 运行 这个(虽然我知道 lastChangeDate 的值是 1480702672000)它的结果是 2147483647000 ...

有没有人建议哪里出了问题?

这样做就可以了:

auto i = 1480702672000;
std::chrono::system_clock::time_point tp{std::chrono::milliseconds{i}};

请注意,由于 system_clock 的纪元未指定,因此 不能保证 按标准工作。然而,所有实施目前都在使用 Unix Time,并且我与实施者达成了非正式协议,在我尝试标准化这一现有做法时,他们不会偏离这一点。

你看到你的行为的原因是你的 json 自 1970-01-01 00:00:00 UTC 以来计算毫秒,但 time_t 通常计算秒(虽然标准也没有规定)。因此,在从 last_change_date_long 创建 last_change_date_raw 的地方,您隐式地将毫秒转换为秒。这将导致日期在 48891 年中途。from_time_t 的实施可能对此感到恐惧(溢出)。

Fwiw,这个特定的时间点代表:

2016-12-02 18:17:52.000 UTC