如何可靠地确定正确的php date.timezone设置?

时间:2017-02-17 19:42:03

标签: php timezone

社会我们是否使用时区,但由于某些原因,php使用了一长串主要城市作为时区设置。我经常在世界各地的网站上工作,要弄清楚哪个时区设置正确并不容易。

例如,您正在德国阿尔布斯塔特的一个网站上工作。你进行谷歌搜索,发现阿尔布斯塔特是GMT + 1。然后,您转到php文档页面,找到:http://php.net/manual/en/timezones.europe.php

好的,有一份欧洲主要城市的名单。不是很有帮助。不,即使页面标题为“支持的时区列表”,它们实际上是“时区”。除非你碰巧知道哪些城市是格林尼治标准时间+ 1,否则看起来你会受到试验和错误的困扰,直到你受到打击。好像在php中应该有一个设置:

date.timezone = 'GMT+1'

但没有。因此我的问题是:如何轻松确定给定地点的正确date.timezone设置?

(注意:我知道这个Q& A:List of US Time Zones for PHP to use?,但我不是在寻找列表,也不考虑“这里是我找到的列表”确定正确设置的可靠方法

1 个答案:

答案 0 :(得分:3)

如果您想了解某个国家/地区的时区,可以使用

print_r(
    DateTimezone::listIdentifiers(
        DateTimeZone::PER_COUNTRY, 
        'DE'
    )
);

这会给你一个输出:

Array
(
    [0] => Europe/Berlin
    [1] => Europe/Busingen
)

Busingen将更接近Albstadt,但这并不重要,因为德国只有一个时区,即CET(和夏季的CEST),所以两者都可以使用。但对于拥有多个时区的国家/地区,这只会让您缩小范围,而不是精确定位。

You can also use GMT,虽然不建议这样做,因为

  

警告:请不要使用此处列出的任何时区(除了UTC),它们仅出于向后兼容的原因而存在,并且可能会出现错误行为。

然而,它确实有效:

date_default_timezone_set('Etc/GMT+10');
echo date(DATE_ATOM); // prints 2017-02-17T10:10:24-10:00

对于CET:

date_default_timezone_set('CET');
echo date(DATE_ATOM); // 2017-02-17T21:31:35+01:00

请务必仔细阅读http://www.iana.org/time-zones/repository/tz-link.html了解更多详情。 IANA是PHP使用的时区数据库的维护者。特别是,这一点很重要:

  

数据库中的每个位置代表自1970年以来所有保持当地时间的时钟都已商定的区域。地点由大陆或海洋识别,然后由位置名称识别,该位置通常是该区域内最大的城市。例如,America / New_York代表美国东部时区的大部分地区;美国/凤凰城代表亚利桑那州的大部分地区,它使用山区时间,没有夏令时(DST);美国/底特律代表密歇根大部分地区,它使用东部时间,但在1975年有不同的夏令时规则;和其他条目代表较小的地区,如印第安纳州的斯塔克县,在1991年从中部转换到东部时间,并在2006年转回。要在扩展的POSIX实现上使用数据库,请将TZ环境变量设置为该位置的全名例如,TZ =" America / New_York"。

另请注意同一页面上标题为时区边界的重要部分。

您可能也对How to get a time zone from a location using latitude and longitude coordinates?

感兴趣