time_since_epoch() 在 std::chrono::local_time 中实际代表什么?

What does time_since_epoch() actually represent in a std::chrono::local_time?

我想通过发送 time_since_epoch().count() 值来序列化 std::chrono::local_time。我的问题是非 C++ 接收器应该如何解释该值?它是自当地午夜 (1970-01-01T00:00:00) 纪元以来的实际滴答数吗?夏令时的变化呢? time_since_epoch() 是挂钟时间的双射吗?即是否可以有两个std::chrono::local_time::time_since_spoch()的值代表同一堵墙clock/calendar时间?

我在常用的地方找不到关于std::chrono::local_time::time_since_spoch()解释的详细信息:cppreference,最新的C++标准草案,或者Howard Hinnant的date library documentation

'Why even serialize a std::chrono::local_time?',你可能会问。嗯,一个用例是一个楼宇自动化系统,它必须在特定日期的给定本地时间执行特定任务,而不管时区或夏令时。例如,“在 2021 年地球日(4 月 22 日)当地时间 20:00 关灯。

编辑: 'Why not serialize it as an ISO8601 date/time (without any offset), you may ask?'。我想使用二进制协议将其序列化为一个紧凑的数字,例如 CBOR。

local_time 中的值与 sys_time 中的值完全相同。例如:

auto lt = local_days{June/3/2021} + 18h + 30min;

lt 是具有指示值的本地时间。将其更改为 sys_time 所需要做的就是将 local_days 更改为 sys_days:

auto st = sys_days{June/3/2021} + 18h + 30min;

即现在可以断言 st.time_since_epoch() == lt.time_since_epoch()ltst 之间的唯一区别是语义。

所以你可以告诉客户把这个数字当作 Unix Time 使用,然后它可以导出年、月、日、时间信息,然后将这些信息视为本地信息(大概)他们当地时区的时间。

在执行“重新解释转换”时,本地指示时间很可能不存在,或者可能不明确,因为它们有两个。通过避免一天中 00:00:00 - 04:00:00 范围内的时间,可以提高不遇到这种情况的几率。如果确实遇到这种情况,那么对于如何处理它没有一个正确的答案。您只需在其余文档中说明一项政策。

...

或者他们可能只是用 C++20 编写解析器...:-)