使用date_default_timezone_set时,澳大利亚DST时区缩写不正确

时间:2014-10-05 01:12:05

标签: php date datetime timezone dst

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

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

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>';

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

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日期'我'所示格式字符,如果夏令时到位,则返回“1”仍然显示非DST缩写。

有什么想法吗?

1 个答案:

答案 0 :(得分:5)

一些事情:

  • 您应该尽可能选择时区名称的规范形式。您提到的区域实际上是链接(又名别名)。有关详细信息,请参阅this chart。具体做法是:

    NZ              => Pacific/Auckland
    Australia/NSW   => Australia/Sydney
    Australia/North => Australia/Darwin
    Australia/South => Australia/Adelaide
    
  • 澳大利亚实际上有5个主要地区有不同的时区规则。您可以参考this Wikipedia article了解详情。

  • Australia/Darwin(又名,Australia/North)完全没有遵守夏令时。

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

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

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

  • 最近在版本2014f 中进行了更改。您可以在the release notes中阅读详细信息。它现在使用AEST作为标准时间,AEDT使用白天时间。

  • 您可以通过将PHP的timezonedb更新为2014.6或更高版本来获得此更改。您可以找到有关更新herehere

  • 的说明
  • 或者,你可以update to the latest version of PHP。根据发布日期,我认为 PHP版本5.3.29应该随timezonedb 2014.6一起提供。使用该版本或更新版本,您应该获得新的缩写。

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