PHP 时区问题 |英国夏令时和格林威治标准时间

Posted

技术标签:

【中文标题】PHP 时区问题 |英国夏令时和格林威治标准时间【英文标题】:PHP timezone issue | BST and GMT 【发布时间】:2015-08-09 06:30:05 【问题描述】:

我开发了一个应用程序,它记录某些记录何时被修改和创建,所以基本上我们使用time() 函数来记录何时保存更改。

我在英国,所以我的时区必须是 GMT。但是在英国,我们使用 DST,所以在夏天我们不再使用 GMT,而是使用 BST。

如何更改时区以使用 BST(即 GMT +1)。我想在我的 php 文件中声明它,以便轻松更改它。这是我目前拥有的:

date_default_timezone_set("UTC");

当我将其更改为:

date_default_timezone_set("BST");

我收到一个 php 错误 Timezone ID 'BST' is invalid,当我将其更改为欧洲/伦敦时,它仍然保持为 GMT 而不是 BST

【问题讨论】:

那么 date_default_timezone_set('Etc/GMT-1'); 【参考方案1】:

您将时区设置为Europe/London,它会在适当的日期在 GMT 和 BST 之间自动转换。时区包括这些信息,这基本上是时区的点(在 PHP 意义上)。

PHP 手册很方便地包含了 this as a sample:

$timezone = new DateTimeZone("Europe/London");
$transitions = $timezone->getTransitions();
print_r(array_slice($transitions, 0, 3));

Array
(
    [0] => Array
        (
            [ts] => -9223372036854775808
            [time] => -292277022657-01-27T08:29:52+0000
            [offset] => 3600
            [isdst] => 1
            [abbr] => BST
        )

    [1] => Array
        (
            [ts] => -1691964000
            [time] => 1916-05-21T02:00:00+0000
            [offset] => 3600
            [isdst] => 1
            [abbr] => BST
        )

    [2] => Array
        (
            [ts] => -1680472800
            [time] => 1916-10-01T02:00:00+0000
            [offset] => 0
            [isdst] => 
            [abbr] => GMT
        )

)

【讨论】:

如前所述,我已将其更改为欧洲/伦敦,但它仍在使用 GMT 而不是 BST(晚一小时) 那么你可能需要update your timezone db。如果它已经过时并且现实世界中的时区定义发生了变化,那么您的 PHP 将没有此信息。 您能否了解一下我应该将这些文件插入时区数据库中的哪个位置?谢谢 见***.com/questions/3564478/…。您应该使用 PECL 来更新 timezonedb 扩展。 但是,根据您安装 PHP 的方式,可能会有更好的方法。例如,您可能应该使用安装 PHP 的包管理器来全面更新您的 PHP 版本。这太宽泛了,无法在评论中正确回答。 在很长一段时间内Europe/London 没有任何改变。【参考方案2】:

time() 函数返回一个 unix 时间戳,该时间戳始终基于 UTC(与 GMT 相同)。为 BST 或任何其他时区调整它是无效的。

还有其他函数用于处理本地时间,以及将 unix 时间戳转换为字符串以进行显示。那是您使用Europe/London 时区的地方。

BST 无效,因为它可能代表“孟加拉国标准时间”或其他几个时区。一般来说,不要依赖时区缩写。

【讨论】:

以上是关于PHP 时区问题 |英国夏令时和格林威治标准时间的主要内容,如果未能解决你的问题,请参考以下文章

英国伦敦时区是UTC+几?(windows 7小工具设置)

如何判断是否英国夏令时

PHP日期时间快速入门(图文详解)

如何在 PHP 中显示 GMT 或 BST?

中国和西班牙的时差是多少

程序代码中的时区问题