关于php:澳大利亚DST时区缩写在使用date_default_timezone_set时不正确

Australia DST timezone abbreviation incorrect when using date_default_timezone_set

我正在尝试使用PHP的date_default_timezone_set函数在不同的时区中表示UTC时间戳。 刚刚开始夏令时(新西兰)和澳大利亚的夏令时,我的结果好坏参半......

这是一些测试代码......

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
date_default_timezone_set('NZ');
print '<p>
NZ time is '
. date('Y-m-d H:i:s T (I)') . '
</p>'
;

date_default_timezone_set('Australia/NSW');
print '<p>
NSW time is '
. date('Y-m-d H:i:s T (I)') . '
</p>'
;

date_default_timezone_set('Australia/North');
print '<p>
NT time is '
. date('Y-m-d H:i:s T (I)') . '
</p>'
;

date_default_timezone_set('Australia/South');
print '<p>
SA time is '
. date('Y-m-d H:i:s T (I)') . '
</p>'
;

从中得到这个输出......

1
2
3
4
5
6
7
NZ time is 2014-10-05 14:04:27 NZDT (1)

NSW time is 2014-10-05 12:04:27 EST (1)

NT time is 2014-10-05 10:34:27 CST (0)

SA time is 2014-10-05 11:34:27 CST (1)

现在,新西兰时区的缩写是正确的(NZDT),所有澳大利亚时代都是正确的,但是两个澳大利亚时代的夏令时是活跃的(如php日期'I'格式字符所示,如果是'I',则返回'1'如果 夏令时到位)仍显示非DST缩写。

有任何想法吗?


一些东西:

  • 您应该尽可能选择时区名称的规范形式。您提到的区域实际上是链接(也称为别名)。有关详细信息,请参阅此图表。特别:

    1
    2
    3
    4
    NZ              => Pacific/Auckland
    Australia/NSW   => Australia/Sydney
    Australia/North => Australia/Darwin
    Australia/South => Australia/Adelaide
  • 澳大利亚实际上有5个主要地区有不同的时区规则。您可能希望参考此Wikipedia文章了解详细信息。

  • Australia/Darwin(aka,Australia/North)根本没有观察夏令时。

  • 其他两个时区(悉尼和阿德莱德)确实将在您指定的日期和时间进行夏令时。但是,澳大利亚时区的名称和缩写并不一定非常清楚。例如,悉尼的日光名称已被以下所有内容引用:

    • 东部夏令时间(EST)
    • 澳大利亚东部夏令时(AEST)
    • 东部夏令时(EDT)
    • 澳大利亚东部夏令时(AEDT)


  • PHP从IANA时区数据库中提取其时区。时区缩写也取自同一来源。很长一段时间,这个数据集在东部标准时间和东部夏令时都使用了"EST"的模糊缩写。

  • 这在2014f版本中最近发生了变化。您可以阅读发行说明中的??详细信息。它现在使用AEST作为标准时间,AEDT作为白天时间。

  • 您可以通过将PHP的timezonedb更新到2014.6或更高版本来获得此更改。您可以在此处或此处找到更新说明。

  • 或者,您可以更新到最新版本的PHP。根据发布日期,我认为PHP版本5.3.29应该与timezonedb 2014.6一起发布。使用该版本或更新版本,您应该获得新的缩写。

  • 您也可以致电timezone_version_get()查看您拥有的timezonedb版本。收到新的缩写应该是2014.6或更高。