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

Emi*_*ier 5 c++ time localtime c++-chrono c++20

我想std::chrono::local_time通过发送 a 的time_since_epoch().count()值来序列化它。我的问题是非 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 的日期库文档

您可能会问, “为什么还要序列化 ​​a std::chrono::local_time?”。嗯,一个用例是一个建筑自动化系统,它必须在特殊日子的给定当地时间执行特定任务,无论时区或夏令时如何。例如,“2021年地球日(4月22日)当地时间20:00关灯。

编辑:“您可能会问,为什么不将其序列化为 ISO8601 日期/时间(没有任何偏移)?”。我想使用二进制协议(例如 CBOR)将其序列化为紧凑数字。

How*_*ant 4

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

auto lt = local_days{June/3/2021} + 18h + 30min;
Run Code Online (Sandbox Code Playgroud)

lt是具有指示值的本地时间。将其更改为 a 所要做的sys_time就是更改local_dayssys_days

auto st = sys_days{June/3/2021} + 18h + 30min;
Run Code Online (Sandbox Code Playgroud)

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

因此,您可以告诉客户端使用这个数字,就好像它是Unix Time一样,然后它可以导出年、月、日、一天中的时间信息,然后将该信息视为(大概)其本地时间中的本地时间区。

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

...

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