从 ubuntu 上的 utc 时间计算 unix 时间

calculation of unix time from utc time on ubuntu

我在我的机器上使用 ubuntu 18.04。我的 ntp 配置为使用 gpsd 作为源。 gpsd 提供的时间不考虑闰秒,但 NTP 会对其进行调整,并为 UTC 提供经过调整的闰秒。所以我的系统时钟将通过 NTP 同步到 UTC。从文档中,std::chrono::system_clock::now 提供自 1970 年以来的时间并且不计算闰秒。 我的问题是当我们调用它时内核会调整闰秒吗?或者从 std::chrono::system_clock::now 查询的时间实际上包含来自 NTP 的同一时间,并调整了闰秒。

system_clock 和 NTP 都 "handle" 以相同的方式跳秒。插入闰秒时,时间会停止。这里我说的是时间标准,而不是任何特定的实现。

在插入闰秒期间,NTP 的实现可能不会停止整整一秒。相反,它可能会在插入闰秒之前和之后将自身延迟几分之一秒,从而使所有延迟的总和为一秒。这被称为 "leap second smear".

所以你可以说 system_clock 和 NTP 都忽略闰秒,因为如果你在这些系统中有两个时间点 t0t1 并且如果 t0引用闰秒插入之前的时间,t1 引用闰秒插入之后的时间,那么表达式 t1-t0 给你的结果是 not插入的闰秒。结果比实际发生的物理秒数少1。

GPS 卫星 "ignores" 闰秒的方式与 system_clock 和 NTP 完全不同。 GPS "clock" 一直滴答作响直到闰秒,几乎 完全忽略了它。然而,GPS 周始终正好是 604,800 秒 (86,400 * 7),即使在这一周的 UTC 中插入了闰秒。

因此,要将 GPS 周(和 GPS 时间)转换为 UTC,必须知道自 GPS 纪元(1980 年 1 月的第一个星期日)以来插入的闰秒总数。我相信 gpsd 在为您提供 UTC 时间点时会为您完成此转换。