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

noi*_*izy 3 php timezone datetime date 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>';
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

Mat*_*int 5

一些东西:

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

    NZ              => Pacific/Auckland
    Australia/NSW   => Australia/Sydney
    Australia/North => Australia/Darwin
    Australia/South => Australia/Adelaide
    
    Run Code Online (Sandbox Code Playgroud)
  • 澳大利亚实际上有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或更高.