【发布时间】:2021-08-22 00:55:10
【问题描述】:
我想通过发送time_since_epoch().count() 值来序列化std::chrono::local_time。我的问题是非 C++ 接收器应该如何解释该值?它是自当地时间午夜 (1970-01-01T00:00:00) 纪元以来的实际滴答数?夏令时的变化呢? time_since_epoch() 是挂钟时间的双射吗?也就是说,std::chrono::local_time::time_since_spoch() 的两个值是否可以代表相同的挂钟/日历时间?
我在通常的地方找不到有关std::chrono::local_time::time_since_spoch() 解释的详细信息:cppreference、最新的 C++ 标准草案或 Howard Hinnant 的 date library documentation。
'为什么还要序列化std::chrono::local_time?',你可能会问。好吧,一个用例将是一个楼宇自动化系统,它必须在特定日期的给定本地时间执行特定任务,而不管时区或夏令时如何。例如,“在 2021 年世界地球日(4 月 22 日)当地时间 20:00 关灯。
编辑: “你可能会问,为什么不将其序列化为 ISO8601 日期/时间(没有任何偏移)?”。我想使用二进制协议(例如 CBOR)将其序列化为紧凑数字。
【问题讨论】:
-
我目前正在使用 Howard Hinnant 的日期库来代替尚未准备好的 C++20 标准库实现。它们的 API 几乎相同。
-
历元通常是 1970-01-01T00:00:00 UTC,而不是本地午夜。这意味着它代表了一个确切的时间瞬间,而与任何人类表示无关。这意味着您不必考虑时区或夏令时或闰秒或任何事情
-
@MooingDuck 我的意思是
chrono::local_tpseudclock 使用的“纪元”。不是实际的 Unix 纪元。其他时钟(chrono::tai_clock、chrono::gps_clock)的纪元与 Unix 纪元不同。 -
@MooingDuck:“std::chrono::local_time 没有时钟就无法解释”。它的意思是在没有任何特定时区的本地上下文中解释(因此得名)。将我的用例解释为:“我希望该建筑物在地球日 20:00 使用建筑物的当地时间(当建筑物所在地变暗时)关闭其灯光”。与自动化服务器交互的客户端将了解它与建筑物的本地时间相关。另请参阅howardhinnant.github.io/date/tz.html#loc_vs_sys中的“除夕派对”说明
-
@MooingDuck:
local_time也使用std::chrono::local_t伪时钟。local_time被简单地定义为template <class Duration> using local_time = std::chrono_point<std::chrono::local_t, Duration>。要将local_time转换为特定的通用时间点(例如,UTC),您必须包含time_zone或与 UTC 的偏移量。
标签: c++ time c++20 chrono localtime