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中,会指定。
我知道 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中,会指定。