std::chrono::time_point 略有偏差

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

如果我执行以下操作:

auto time = std::chrono::system_clock::duration::zero();
std::cout << time.count() << std::endl;
time += std::chrono::years(2024 - 1970);
std::cout << time.count() << std::endl;

结果是 2024 年 1 月 1 日星期一凌晨 2:16:48,而不是凌晨 12 点。我想代表历史日历日期。

year_month_day
hh_mm_ss
都可以使用,但我喜欢拥有获得
time_point::time_since_epoch()
的能力。我需要这个,因为它是将日期和时间数据作为单个 int64 存储在数据库中的便捷方法。有没有办法两全其美?

正如我所见,我唯一的选择是自己处理计时并继续使用

std::chrono
,但这违背了使用
std::chrono
的目的,或者使用
chrono::year_month_day
chrono::hh_mm_ss
并以不同的方式处理数据库方式。

c++ c++-chrono
1个回答
0
投票

你的

time += std::chrono::years(2024 - 1970);

表明您想要使用“日历时间”,而不是时间戳。

C++20 添加了对日历和时区的支持(这是必要的——例如,在夏令时更改的那天,一天可能有 23 或 25 小时,而不是习惯上的 24 小时)。不过我还没用过这些。

查看概述 https://en.cppreference.com/w/cpp/chrono

但是,“传统”日历调用通常就足够了。例如,如果您有

std::chrono::system_clock::time_point
,则可以使用
std::chrono::system_clock::to_time_t()
为其获取
time_t
。然后,您可以使用
std::localtime
time_t
分解为当地的秒/分钟/小时/日/月/年。还有一个
std::mktime()
做相反的事情,以及
std::chrono::system_block::from_time_t
返回到
time_point

std::mktime
的有趣之处在于它允许“无效”值作为输入,并“修复”它们。例如,假设现在是“2 月 28 日”,并且您想要到达第二天。您只需在该天添加 1,使其成为“Feb 29”——如果该特定年份没有“Feb 29”,则会将其视为“Mar 1”。

同样,如果跨越夏令时开关,与向小时添加 +24 相比,向日添加 +1 会产生不同的结果。因此,忘记“一天有 24 小时”或“一年有 365 天”,并使用您实际需要的字段进行算术运算。

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