如果你想知道一个国家的时区,你可以使用
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?
某人,某个地方,将不得不维持,因为这个东西的更改列表。我不确定是否有比查询某个列表或API更好的答案。 – NathanOliver
特别是,它是IANA:http://www.iana.org/time-zones/repository/tz-link.html – Gordon
按照您建议的方式执行此操作的一个问题是它不考虑DST。举个例子,[America/Sao_Paulo](http://php.net/manual/en/timezones.america.php)和America/Bahia都是GMT -3,但是America/Sao_Paulo巴西夏令时,而“美国/巴伊亚”不。 – duplode