c++ - 闰秒和 std::chrono

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

我查看了 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 可能 不是.

进一步阅读

关于c++ - 闰秒和 std::chrono,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56618615/

相关文章:

c++ - HDF5 Cpp - 检索文件中所有组的名称

c++ - 是否定义了 std::chrono::duration 中的 std::ratio 计算顺序?

string - 为什么使用通用 lambda 对字符串向量进行排序不起作用?

c++ - 模棱两可的重载运算符 C++20

c++ - 在 C++ 中不使用 cmath 计算 n 次根的有效方法

Xcode 中的 C++ Quantlib EXC_BAD_ACCESS

c++ - 链接描述文件条件包含

c++ - ReleaseFloatArrayElements 和 DeleteLocalRef 有什么区别

c++ - 对象的生命周期

c++ - Boost_chrono lib 未安装