我查看了 cppreference.org(强调我的):
The clock
std::chrono::utc_clock
is a Clock that represents Coordinated Universal Time (UTC). It measures time since 00:00:00 UTC, Thursday, 1 January 1970, including leap seconds.
将其与 system_clock
的定义进行比较:
system_clock
measures Unix Time (i.e., time since 00:00:00 Coordinated Universal Time (UTC), Thursday, 1 January 1970, not counting leap seconds).
是否真的可以在同一个系统中同时使用两者?例如,如果系统时钟是通过 NTP 同步的,那么服务器会决定现在几点,可以使用闰秒或不使用闰秒,但 C++ 库实现对此一无所知。或者,该标准是否需要有关何时引入闰秒的数据库?
最佳答案
NTP 服务器为您提供 UTC(自 1900 年以来的秒数格式)。当前时间,就是当前时间。为了到达那里有多少闰秒并不重要。
事情变得复杂的地方是添加闰秒。 NTP 将立即宣布这一点,并且各种操作系统会在内部做各种事情来记录这一点,因为它们倾向于将时间存储为“自纪元以来的秒数”——Linux 和 Windows 不包括闰秒,因为这会使他们的时间戳渲染更加复杂(有多少闰秒?)并且他们无法处理。相反,他们只是在宣布的闰秒前后将时钟减慢或加快了一小会儿,因此他们并没有实际记录它,而是调整了自己的秒数,这样渲染后作为时间戳的计数将在以后显得准确。
(我不知道操作系统如何在不知道要扣除多少闰秒的情况下,重新确定 NTP 事务中的秒数,虽然不是真的,但有点像;欢迎编辑。)
system_clock
为您提供秒数,(在主流平台上)直接来自操作系统(例如 time()
)。
utc_clock
为您提供类似的秒数,但它是“真实的”。在此类主流平台上,这必然是 system_clock
,事后添加了闰秒。这个历史数据也是来自系统,确实some kind of database (尽管确切的来源取决于实现)。
总而言之,两个时钟的数据源(略)不同,因此不存在它们是否可以在同一系统中共存的问题。但是,system_clock
可能 直接来自您的操作系统,utc_clock
可能 不是.
进一步阅读
- NTP 和闰秒:https://www.meinbergglobal.com/english/info/leap-second.htm#os
- 新的
utc_clock
功能及其 friend :https://howardhinnant.github.io/date/d0355r4.html
关于c++ - 闰秒和 std::chrono,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56618615/