我看了看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秒后该标准是否需要数据库?
答案 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
可能则不是。
utc_clock
功能及其朋友:https://howardhinnant.github.io/date/d0355r4.html 答案 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 ++代码。