我想将 Unix 系统配置为在国际原子时间(TAI) 上运行,以便能够看到正确报告为 2016-12-31 23:59:60 的年终闰秒。我知道这会导致系统的时间戳与 POSIX 的时间戳不兼容,但我这样做是作为一个实验。我已经将时区文件从复制/usr/share/zoneinfo/right/
到/etc/localtime
. 这些是我的问题。
- 如何准确设置系统时间?我知道它必须设置为 TAI 秒,而不是 UTC 秒。是否可以通过 NTP 做到这一点?目前,系统显示的时间与正确的时间相差 36 秒。
- 2017-02-01 之后显示的时间会继续正确吗?时
zoneinfo/right
区文件是否需要更新?
首先,计算机系统上的时钟必须提供 TAI 或 UTC 的概念并不完全准确。我可以通过时区获取和设置时间,例如 GNU coreutils date 命令非常灵活。在设置为 right/UTC 的系统上(稍后会详细介绍):
请参阅 ESR 的文章 Time, Clock, and Calendar Programming In C 了解所涉及的实际数据结构,以及一些很好的参考资料。
您仍然可以像往常一样配置 ntp、ptp 或发出 well-timed
date
或chronyc settime
命令。但是,您需要了解 TAI - UTC 偏移量以及您的源时间。NTP 时间是标准的 UTC,因此只需在 UTC 同步系统上设置“正确”区域,TAI - 10 - UTC 就会关闭,目前是 26。
相反,一些 NTP 服务器可以提供 GPS 或 TAI。这加上一些闰秒黑客将摆脱内核或用户登陆时间同步纠正的闰秒错误。请参阅:“正确”tz 数据库 (zoneinfo) 文件和基于 GPS 的 NTP
请注意,第二天 86401 是非标准的,并且违反了 POSIX 的要求。如果设置执行此操作的 NTP 服务器,它们将无法为其他系统提供时间。它还可能导致依赖于特定格式时间的应用程序出现奇怪的行为。
TZ 数据需要更新,一年两次会赶上闰秒。如果您出于这个原因修补闰秒,您将需要再次执行此操作。(很可能由于各种原因,您已经需要比这更频繁地更新其他软件。)会有额外的闰秒,地球的自转变化是物理上的必需品。由于……较少的技术原因,可能的时区和夏令时更改也存在政治必要性。
好时机,因为下一个闰秒是2016 年 12 月 31 日 23h 59m 60s。
如果使用 UTC,Red Hat 发布了一份很好的总结,介绍了在 Linux 上处理它的方法。请注意,许多站点会重复、涂抹或让 NTP 修复第二个错误,而无需显示第 61 秒。 解决红帽企业 Linux 中的闰秒问题
这一切对我来说似乎是很多工作。如果我可以让 NTP 或内核通过 Red Hat 描述的方法来处理它,我宁愿看不到第 61 秒。
时区文件可能需要更新。您可以通过运行命令来测试它以查看已安装时区文件中的转换。以下示例包含闰秒转换。
$ zdump -c 2017,2018 -v /etc/localtime /etc/localtime -9223372036854775808 = NULL /etc/localtime -9223372036854689408 = NULL /etc/localtime Sat Dec 31 23:59:60 2016 UT = Sun Jan 1 01:59:60 2017 EET isdst=0 gmtoff=7200 /etc/localtime Sun Jan 1 00:00:00 2017 UT = Sun Jan 1 02:00:00 2017 EET isdst=0 gmtoff=7200 /etc/localtime Sun Mar 26 00:59:59 2017 UT = Sun Mar 26 02:59:59 2017 EET isdst=0 gmtoff=7200 /etc/localtime Sun Mar 26 01:00:00 2017 UT = Sun Mar 26 04:00:00 2017 EEST isdst=1 gmtoff=10800 /etc/localtime Sun Oct 29 00:59:59 2017 UT = Sun Oct 29 03:59:59 2017 EEST isdst=1 gmtoff=10800 /etc/localtime Sun Oct 29 01:00:00 2017 UT = Sun Oct 29 03:00:00 2017 EET isdst=0 gmtoff=7200 /etc/localtime 9223372036854689407 = NULL /etc/localtime 9223372036854775807 = NULL
如果时区文件需要更新,并且您的操作系统发行版没有提供闰秒(/右)时区文件,您可以按如下方式设置时区文件。
sudo cp
tzdir/etc/zoneinfo-leaps/
你的时区/etc/localtime
要从 NTP 服务器设置时间,您可以配置和安装 rdate (openrdate),然后运行命令,例如
sudo rdate -s -c -n 0.gentoo.pool.ntp.org
.