std::chrono::system_clock.now().time_since_epoch().count() 的值是否单调递增?

Does the value of std::chrono::system_clock.now().time_since_epoch().count() increase monotonically?

我知道 steady_clock 并且它是唯一指定为单调的时钟。而且我知道 system_clock 由于夏令时和闰年可以向前或向后跳转。但是 count() 不会给你自 Unix 纪元以来的系统时钟滴答数吗?这个数字一直在增加,不管整数滴答数是如何解析成 "calendar date + wall clock" 解释的? 即使"calendar date + wall clock"在三月的某一天从凌晨2点从凌晨3点跳转,滴答的整数计数不是只增加了一个滴答吗?

简而言之,std::chrono::system_clock.now().time_since_epoch().count() 的值应该 在短期内 单调增加(除非更新到系统时钟,这当然是一个非常真实的事件),即使它所指的日期+时间跳来跳去?

编辑

正如@SergeyA 所指出的,如果系统时钟发生变化,那么该值当然会跳来跳去。但我认为由于夏令时而导致的挂钟时间变化不是 NTP 更新事件或用户手动更改。如果它有助于澄清问题,我对一两个小时的正常运行时间感兴趣,这可能会跨越 DST 边界,而不是数周或数月的正常运行时间,时钟可能会漂移。

简答 - 不,不是。作为手动操作或源(NTP、PTP)同步的结果,系统时钟可以(并且将在实践中!)在外部进行调整。

system_clock 轨道 Unix Time. Unix Time 没有 UTC 偏移量调整(夏令时)。它只是非闰秒的线性计数。在闰秒插入期间,实现可能会向后跳转。尽管实际上闰秒是 "smeared",但在几个小时内会进行许多微小的调整。

理论上 system_clock 可以是单调的。在实践中,没有时钟保持完美的时间,必须进行调整(可能向后)以与 Unix Time.

保持同步

在 C++11/14/17 中,没有为 system_clock 指定 Unix Time 措施,但这是现有的做法。在C++20中,会指定