飞跃秒和std :: chrono

时间:2019-06-16 11:57:53

标签: c++ chrono c++20 leap-second

我看了看cppreference.org(重点是我):

  

时钟std::chrono::utc_clock是代表协调世界时(UTC)的时钟。它测量的时间是从1970年1月1日星期四00:00:00 UTC开始的时间,其中<​​em>包括leap秒。

将其与system_clock的定义进行比较:

  

system_clock测量Unix时间(即,自1970年1月1日,星期四,00:00:00(协调世界时)开始的时间,不计算leap秒)。

>

实际上可以将两者都放在同一个系统中吗?例如,如果系统时钟是通过NTP同步的,则服务器将决定现在的时间,这可能会使用leap秒,但C ++库实现对此一无所知。还是在引入does秒后该标准是否需要数据库?

2 个答案:

答案 0 :(得分:2)

NTP服务器为您提供UTC(自1900年起,格式为秒)。当前时间是当前时间。到达那里有多少leap秒并不重要。

使问题变得复杂的是添加when秒。 NTP将立即宣布这一点,由于它们倾向于将时间存储为“自某个纪元以来的秒数”,因此各种操作系统会在内部做各种事情来记录该事件-Linux和Windows在其中不包括leap秒。这会使他们的时间戳渲染变得更加复杂(已经有多少leap秒了?),他们无法处理。取而代之的是,它们只是在宣布的leap秒附近放慢了时钟或加快了一点时间,所以与其实际记录,他们只是调整自己的秒计数,以便稍后将计数呈现为时间戳记。

(我不知道操作系统将如何从NTP事务中重新确定其不是真的而是几秒的计数,而不知道要减去多少leap秒;欢迎进行编辑。)< / em>

system_clock为您提供了此秒数,(在主流平台上)仅来自操作系统(例如time())。

utc_clock为您提供了类似的秒数,但它是“真实的”。在这样的主流平台上,必须将system_clock加上事后添加leap秒。这些历史数据也来自系统,实际上是some kind of database(尽管确切的来源取决于实现)。

总而言之,两个时钟的数据源(略有不同),因此毫无疑问它们是否可以在同一系统上共存。但是,system_clock 可能直接来自您的操作系统,而utc_clock 可能则不是。

进一步阅读

答案 1 :(得分:1)

我发现this working draft about time用于C ++ 20,它似乎应该在公元2020年到期。它有一个subpage about utc_clock,其中包括以下示例:

clock_­cast<utc_­clock>(sys_­seconds{sys_­days{1970y/January/1}}).time_­since_­epoch() is 0s.
clock_­cast<utc_­clock>(sys_­seconds{sys_­days{2000y/January/1}}).time_­since_­epoch()

并指出最后一个值“是946'684'822s,即10'957 * 86'400s + 22s”。请注意,有10,957天是大约30年,因此utc_clock的值显然表示自1970年1月1日UTC以来的秒数,其中每一leap秒都会增加utc_clock的值。

由于这表示为转换,因此推断转换似乎需要leap秒表,并且即使操作系统没有关于UTC和TAI之间区别的概念,也没有概念,也可以执行转换一分钟,共61秒。

我必须承认我比C ++对时间更感兴趣,并且在近20年的时间里没有编写过认真的C ++代码。