2017-02-17 40 views
0

社会我们使用时区,但由于某些原因,PHP使用一长串主要城市的时区设置。我经常在世界各地的网站上工作,并且很难确定哪个时区设置是正确的。如何可靠地确定正确的php date.timezone设置?

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

好吧,这里有一个欧洲主要城市的列表。不是很有帮助。即使该页面的标题为“支持的时区列表”,实际上它们是而不是“时区”。除非你碰巧知道哪些城市是GMT + 1,看起来你有点卡住试验和错误,直到你受到打击。似乎应该有一个像PHP设置:

date.timezone = 'GMT+1' 

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

(注意:我知道这个问答& A的:List of US Time Zones for PHP to use?,但我不是在寻找一个名单,我也不认为“这里是一个名单,我发现”一个可靠的方法来确定正确的设置)

+1

某人,某个地方,将不得不维持,因为这个东西的更改列表。我不确定是否有比查询某个列表或API更好的答案。 – NathanOliver

+5

特别是,它是IANA:http://www.iana.org/time-zones/repository/tz-link.html – Gordon

+2

按照您建议的方式执行此操作的一个问题是它不考虑DST。举个例子,[America/Sao_Paulo](http://php.net/manual/en/timezones.america.php)和America/Bahia都是GMT -3,但是America/Sao_Paulo巴西夏令时,而“美国/巴伊亚”不。 – duplode

回答

3

如果你想知道一个国家的时区,你可以使用

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

这将给你喜欢的输出:

Array 
(
    [0] => Europe/Berlin 
    [1] => Europe/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年有不同的DST规则;其他条目代表较小的区域,例如印第安纳州的Starke County,它在1991年从中央时间切换到东部时间,并在2006年切换。为了在扩展的POSIX实施中使用数据库,将TZ环境变量设置为位置的全名,例如TZ = “美国/纽约”。

还要注意大段标题为时区边界在同一页上。

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

+0

这是非常棒的信息 - 尤其是最后一个环节。 PHP是否依赖IANA的数据库在某处存档或仅仅是假设? – billynoah

+1

@billynoah在http://php.net/manual/en/timezones.others.php提及。另外,http://php.net/manual/en/timezones.php表示最新版本的时区数据库可以通过PECL的»timezonedb(https://pecl.php.net/package/timezonedb)进行安装,此扩展使用的数据来自位于http://www.iana.org/time-zones的“Olson”数据库,该数据库为 。 – Gordon