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()
。 lt
和 st
之间的唯一区别是语义。
所以你可以告诉客户把这个数字当作 Unix Time 使用,然后它可以导出年、月、日、时间信息,然后将这些信息视为本地信息(大概)他们当地时区的时间。
在执行“重新解释转换”时,本地指示时间很可能不存在,或者可能不明确,因为它们有两个。通过避免一天中 00:00:00 - 04:00:00 范围内的时间,可以提高不遇到这种情况的几率。如果确实遇到这种情况,那么对于如何处理它没有一个正确的答案。您只需在其余文档中说明一项政策。
...
或者他们可能只是用 C++20 编写解析器...:-)
我想通过发送 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()
。 lt
和 st
之间的唯一区别是语义。
所以你可以告诉客户把这个数字当作 Unix Time 使用,然后它可以导出年、月、日、时间信息,然后将这些信息视为本地信息(大概)他们当地时区的时间。
在执行“重新解释转换”时,本地指示时间很可能不存在,或者可能不明确,因为它们有两个。通过避免一天中 00:00:00 - 04:00:00 范围内的时间,可以提高不遇到这种情况的几率。如果确实遇到这种情况,那么对于如何处理它没有一个正确的答案。您只需在其余文档中说明一项政策。
...
或者他们可能只是用 C++20 编写解析器...:-)