我在机器上使用ubuntu 18.04。我的ntp配置为使用gpsd作为源。 gpsd提供的时间不考虑leap秒,但NTP会对其进行调整,并为UTC提供已调整的leap秒。因此,我的系统时钟将通过NTP同步到UTC。根据文档,std::chrono::system_clock::now
提供自1970年以来的时间,不算leap秒。
我的问题是,当我们称此为内核时,内核会调整leap秒吗?或者从std::chrono::system_clock::now
查询的时间实际上包含来自NTP的相同时间,并且已调整leap秒。
system_clock
和NTP都以相同的方式“处理” leap秒。插入a秒时,时间只是停止。这里我说的是时间标准,而不是任何特定的实现。
在a秒插入过程中,NTP的实现可能不会停止一整秒钟。相反,它可能会在a秒插入之前和之后的几个小时内延迟几分之一秒,从而使所有延迟之和为一秒。这就是所谓的“ le秒涂片”。
因此,您可以说system_clock
和NTP都忽略leap秒,因为如果这些系统中有两个时间点t0
和t1
并且t0
引用了一个a秒插入之前的时间,而t1
引用leap秒插入之后的时间,则表达式t1-t0
给出的结果不不计算插入的leap秒。结果比实际发生的物理秒数少1。
GPS卫星以与system_clock
和NTP完全不同的方式“忽略” leap秒。 GPS的“时钟”一直持续tick秒,几乎完全忽略了它们。但是,即使在那个星期的UTC插入了leap秒,GPS周也总是精确地为604,800秒(86,400 * 7)。
因此,要将GPS周(和一周中的GPS时间)转换为UTC,必须知道自GPS时代(1980年1月的第一个星期日)以来插入的of秒总数。我相信gpsd在为您提供UTC时间点时会为您完成这种转换。