下面是一个例子:
root@linux:~# timedatectl
Local time: Thu 2016-03-31 08:33:23 CEST
Universal time: Thu 2016-03-31 06:33:23 UTC
RTC time: n/a
Time zone: Africa/Ceuta (CEST, +0200)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: yes
Last DST change: DST began at
Sun 2016-03-27 01:59:59 CET
Sun 2016-03-27 03:00:00 CEST
Next DST change: DST ends (the clock jumps one hour backwards) at
Sun 2016-10-30 02:59:59 CEST
Sun 2016-10-30 02:00:00 CET
root@linux:~# echo $string
1970 01 01 0 0 0
root@linux:~# awk -v str="$string" 'BEGIN {print mktime(str)}'
0
root@linux:~# timedatectl set-timezone Europe/Berlin
root@linux:~# timedatectl
Local time: Thu 2016-03-31 08:59:01 CEST
Universal time: Thu 2016-03-31 06:59:01 UTC
RTC time: n/a
Time zone: Europe/Berlin (CEST, +0200)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: yes
Last DST change: DST began at
Sun 2016-03-27 01:59:59 CET
Sun 2016-03-27 03:00:00 CEST
Next DST change: DST ends (the clock jumps one hour backwards) at
Sun 2016-10-30 02:59:59 CEST
Sun 2016-10-30 02:00:00 CET
root@linux:~# echo $string
1970 01 01 0 0 0
root@linux:~# awk -v str="$string" 'BEGIN {print mktime(str)}'
-3600
2个问题:为什么欧洲/柏林时区的mktime输出(当输入1970-01-01T00:00:00时)是-1小时?
timedatectl
(显然)显示了当前设置时区的当前时区规则。但是,时区规则在同一时区内随时间变化。
截至今天,非洲/休达和欧洲/柏林都有相同的UTC偏移,并遵循完全相同的夏令时规则。但他们并不总是这样做。
1970-01-01年,非洲/休达使用了0:00:00UTC偏移,没有使用夏令时。
1970-01-01年,欧洲/柏林使用了协调世界时1:00的偏移量,没有使用夏令时。
直到1986-03-30 01:00:00 UTC,非洲/休达和欧洲/柏林才采用了相同的规则。您的计算机知道此历史记录,并在UTC和当地时间之间转换1986-03-30之前的日期时准确反映它。
它们在不同的日期更改为夏季和冬季时间,这就是为什么即使它们具有相同的UTC偏移,时间也可能不同的原因