我在不同的系统中对此进行了比较,但仅在运行 Arago linux 的嵌入式系统中获得此行为。我使用 BusyBox v.1.13.2 中的日期命令
我“同时”执行了这两个命令:
[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 秒的偏移量从何而来?
答案1
25 秒是 2012 年 7 月 1 日至 2015 年 7 月 1 日期间符合 POSIX 的 tz 区域与“正确”tz 区域之间的差异。如果 tzdata 是那么旧,并且运行此命令的 shell 的默认时区是 POSIX CET 并且“-u”时区是 UTC 的“正确”版本,那么“正确”代码将假定系统时钟被违反POSIX 通过实际计算所有闰秒,因此“正确”代码将减去这 25 秒,作为将系统时钟转换为民用时间的一部分。
答案2
通过跟踪第一个命令 ( date
):
open("/etc/localtime", O_RDONLY)
它访问指向的时区文件/etc/当地时间这是/usr/share/zoneinfo/欧洲/苏黎世就我而言。所以到目前为止一切都很好。
第二个命令 () 的 stracedate -u
给了我提示为什么它不能正常工作:
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