UTC 与本地时间有大约 25 秒的偏移

UTC 与本地时间有大约 25 秒的偏移

我在不同的系统中对此进行了比较,但仅在运行 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

答案3

04:05:12 CET 和 1457838339 modulo 86400 之间的差异在于时区。如果您得到的偏移量为 27 秒,则意味着您的时区定义有问题,最终指定的偏移量为 27 秒,而不是预期的(大概)1 小时。检查您的时区设置,从TZ变量开始。 Arago Linux 使用 Glibc,它具有指定时区的几个选项但通常使用标准时区数据库中的时区文件(因此TZ应该CET或者更好的是Europe/Paris遵守当地 DST 规则并遵循历史演变;或者TZ应该取消设置为 use /etc/localtime)。您可以使用zdump -v获取时区的描述。

相关内容