【问题标题】:How to reliably determine the correct php date.timezone setting?如何可靠地确定正确的 php date.timezone 设置?
【发布时间】:2017-02-17 19:42:03
【问题描述】:

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

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

好的,这里有欧洲主要城市的列表。不是很有帮助。不,即使页面标题为“支持的时区列表”,它们实际上不是“时区”。除非您碰巧知道这些城市中的哪个是 GMT+1,否则您似乎有点陷入反复试验,直到获得成功。似乎应该在php中有一个设置:

date.timezone = 'GMT+1'

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

(注意:我知道这个问答:List of US Time Zones for PHP to use?,但我不是在寻找列表,我也不认为 “这是我找到的列表”确定正确的设置)

【问题讨论】:

  • 某个地方的某个人将不得不维护一个列表,因为这些东西发生了变化。我不确定是否会有比查询某些列表或 API 更好的答案。
  • 按照您建议的方式进行操作的一个问题是它不考虑 DST。举个任意的例子,America/Sao_PauloAmerica/Bahia 都是 GMT -3,但 America/Sao_Paulo 遵循巴西 DST,而 America/Bahia 没有。
  • @duplode - 你是 100% 正确的。我想我习惯于将“东部标准时间”和“格林威治标准时间”之类的东西视为时区,并且不知道 IANA 的数据库。
  • 请阅读timezone tag wiki。特别是“时区!=偏移”部分

标签: php timezone


【解决方案1】:

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

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

这会给你这样的输出:

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

Busingen 离阿尔布施塔特更近,但这没关系,因为德国只有一个时区,即 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 代表美国东部时区的大部分地区; America/Phoenix 代表亚利桑那州的大部分地区,该州使用山区时间,没有夏令时 (DST);美国/底特律代表密歇根州的大部分地区,使用东部时间,但 1975 年的 DST 规则不同;其他条目代表较小的区域,例如印第安纳州斯塔克县,该地区于 1991 年从中部时间切换到东部时间并在 2006 年切换回。要在扩展的 POSIX 实现中使用数据库,请将 TZ 环境变量设置为该位置的全名,例如 TZ ="美国/纽约"。

还要注意同一页面上标题为时区边界的大部分。

你可能也对How to get a time zone from a location using latitude and longitude coordinates?感兴趣

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-05-20
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多