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
我是 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