【问题标题】:Australia DST timezone abbreviation incorrect when using date_default_timezone_set使用 date_default_timezone_set 时澳大利亚 DST 时区缩写不正确
【发布时间】:2014-11-29 16:13:14
【问题描述】:

我正在尝试使用 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 日期“I”所示)格式字符,如果有夏令时则​​返回“1”)仍然显示非 DST 缩写。

有什么想法吗?

【问题讨论】:

  • List of supported Australia timezones 用于date_default_timezone_set 函数
  • 谢谢 2pha - 我正在使用相关澳大利亚州支持的时区,时区缩写的所有内容都会正确返回。
  • 啊,我,对不起,我刚醒来。你确定缩写是不同的吗?我认为他们是正确的。我不认为缩写会因为 1 使用夏令时而 1 不使用而有所不同。
  • 新西兰时区缩写的表现符合我的预期。在 DST 开始之前,它显示为 NZST。现在它(正确地)显示为 NZDT。我假设澳大利亚时区缩写的行为相同(EST -> EDT),但事实并非如此。困惑。

标签: php date datetime timezone dst


【解决方案1】:

一些事情:

  • 您应该尽可能首选时区名称的规范形式。您提到的区域实际上是链接(又名别名)。详情请参阅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 或更高版本。

【讨论】:

  • 太棒了。谢谢@马特。我的登台服务器正在运行 2013.9,并且还无法将文件发布到生产服务器进行检查,但我认为它是在类似的版本上。我将让服务器管理员进行这些 timezonedb 更新(一旦问题解决,我会给你一个很大的提示!)干杯。
  • (顺便说一下,登台服务器正在运行 PHP 5.4.25,并且没有正确报告那些 DST 时区)。
  • 我不确定哪个版本的 timezonedb 附带哪个版本的 PHP。我以为每次构建都会更新到当前版本,但我可能弄错了。
  • 成功!使用 PECL 安装最新的 timezonedb 包,一切都开始了。魔术。再次感谢@matt。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多