Linux

UTC 與本地時間的偏移量約為 25 秒

  • October 31, 2019

我在不同的系統中對此進行了比較,但只能在執行 Arago linux 的嵌入式系統中獲得這種行為。我使用 BusyBox v.1.13.2 中的 date 命令

我“同時”執行了這兩個命令:

[root@host:~] date; date -u
Fri Mar 18 12:56:49 CET 2016
Fri Mar 18 11:57:14 UTC 2016

zdump 的輸出與預期一致(+3600 秒;+1 小時):

/etc/localtime  Sun Mar 29 01:00:24 2015 UT = Sun Mar 29 01:59:59 2015 CET isdst=0 gmtoff=3600
/etc/localtime  Sun Mar 29 01:00:25 2015 UT = Sun Mar 29 03:00:00 2015 CEST isdst=1 gmtoff=7200
/etc/localtime  Sun Oct 25 01:00:24 2015 UT = Sun Oct 25 02:59:59 2015 CEST isdst=1 gmtoff=7200
/etc/localtime  Sun Oct 25 01:00:25 2015 UT = Sun Oct 25 02:00:00 2015 CET isdst=0 gmtoff=3600
/etc/localtime  Sun Mar 27 01:00:24 2016 UT = Sun Mar 27 01:59:59 2016 CET isdst=0 gmtoff=3600
/etc/localtime  Sun Mar 27 01:00:25 2016 UT = Sun Mar 27 03:00:00 2016 CEST isdst=1 gmtoff=7200
/etc/localtime  Sun Oct 30 01:00:24 2016 UT = Sun Oct 30 02:59:59 2016 CEST isdst=1 gmtoff=7200
/etc/localtime  Sun Oct 30 01:00:25 2016 UT = Sun Oct 30 02:00:00 2016 CET isdst=0 gmtoff=3600
/etc/localtime  Sun Mar 26 01:00:24 2017 UT = Sun Mar 26 01:59:59 2017 CET isdst=0 gmtoff=3600
/etc/localtime  Sun Mar 26 01:00:25 2017 UT = Sun Mar 26 03:00:00 2017 CEST isdst=1 gmtoff=7200

這個 25 秒的偏移量是從哪裡來的?

按照第一個命令 ( date) 的 strace :

open("/etc/localtime", O_RDONLY)

它訪問**/etc/localtime指向的時區文件,在我的例子中是/usr/share/zoneinfo/europe/Zurich**。所以到目前為止一切都很好。

第二個命令 ( date -u) 的 strace 提示了它為什麼不能正常工作:

open("/usr/share/zoneinfo/UTC0", O_RDONLY)

zoneinfo 目錄中沒有這樣的文件,所以我不得不將 UTC 複製到 UTC0,現在一切正常。

date; date -u
Fri Apr 26 09:52:44 CET 2016
Fri Apr 26 07:52:44 UTC 2016

25 秒是 2012 年 7 月 1 日到 2015 年 7 月 1 日期間符合 POSIX 的 tz 區域和“正確”的 tz 區域之間的差異。如果 tzdata 是舊的並且如果執行此命令的 shell 的預設時區是 POSIX CET 並且“-u”時區是 UTC 的“正確”版本,那麼“正確”程式碼將假定係統時鐘違反POSIX 通過實際計算所有閏秒,因此“正確”程式碼將減去這 25 秒作為將系統時鐘轉換為民用時間的一部分。

引用自:https://unix.stackexchange.com/questions/270007