为什么具有相同UTC偏移的两个时区的时间戳不同?

时间:2016-03-31 08:55:22

标签: linux time timezone

以下是一个例子:

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小时?

2 个答案:

答案 0 :(得分:1)

timedatectl(显然)显示当前设置的时区有效的当前时区规则。但是,时区规则会在同一时区内随时间变化。

截至今天,非洲/休达和欧洲/柏林都有相同的UTC偏移量,并遵循完全相同的夏令时规则。但他们并非总是如此。

在1970-01-01,Africa / Ceuta使用0:00:00 UTC偏移量,并且没有使用夏令时。

在1970-01-01,欧洲/柏林使用1:00:00 UTC偏移,并且没有使用夏令时。

直到1986-03-30 01:00:00 UTC,非洲/休达和欧洲/柏林采用相同的规则。您的计算机知道此历史记录,并在1986年至1990年之前的UTC和本地时间之间进行转换时准确反映该历史记录。

答案 1 :(得分:0)

它们会在不同日期更改为夏季和冬季时间,这就是为什么时间可能会有所不同,即使它们具有相同的UTC偏移量