Linux
UTC 與本地時間的偏移量約為 25 秒
我在不同的系統中對此進行了比較,但只能在執行 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 秒作為將系統時鐘轉換為民用時間的一部分。