关于php:如何判断时区是否在一年中的任何时候都能观察到夏令时?

How to tell if a timezone observes daylight saving at any time of the year?

在PHP中,您可以使用如下方法来判断给定日期是否在夏令时期间:

1
$isDST = date("I", $myDate); // 1 or 0

问题是,这只告诉您一个时间点是否在DST中。是否有可靠的方法来检查DST在该时区的任何时间是否有效?

编辑以澄清:

  • 澳大利亚布里斯班每年的任何时候都不遵守夏令时。全年都是格林尼治标准时间+10。
  • 澳大利亚的悉尼从10月到3月,从格林尼治标准时间+10改为格林尼治标准时间+11。

我想知道是否会有一些现有的方法,或者一种方法来实现这样的方法:

1
2
timezoneDoesDST('Australia/Brisbane');  // false
timezoneDoesDST('Australia/Sydney');  // true


我找到了一个使用PHP的DateTimeZone类(php5.2+)工作的方法。

1
2
3
4
5
function timezoneDoesDST($tzId) {
    $tz = new DateTimeZone($tzId);
    $trans = $tz->getTransitions();
    return ((count($trans) && $trans[count($trans) - 1]['ts'] > time()));
}

或者,如果运行的是php5.3+

1
2
3
4
function timezoneDoesDST($tzId) {
    $tz = new DateTimeZone($tzId);
    return count($tz->getTransitions(time())) > 0;
}

getTransitions()函数为您提供有关时区每次偏移量更改的信息。这包括历史数据(1916年布里斯班有日光节约。谁知道呢?),因此此函数检查将来是否有偏移量更改。


实际上,nickf方法对我不起作用,所以我对它做了一些修改…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* Finds wherever a TZ is experimenting dst or not
* @author hertzel Armengol
* @params string TimeZone -> US/Pacific for example
*
*/

function timezoneExhibitsDST($tzId) {
    $tz = new DateTimeZone($tzId);
    $date = new DateTime("now",$tz);  
    $trans = $tz->getTransitions();
    foreach ($trans as $k => $t)
      if ($t["ts"] > $date->format('U')) {
          return $trans[$k-1]['isdst'];    
    }
}

// Usage  

var_dump(timezoneExhibitsDST("US/Pacific")); --> prints false
var_dump(timezoneExhibitsDST("Europe/London")); --> prints false
var_dump(timezoneExhibitsDST("America/Chicago")); --> prints false

同一个函数调用将在1个月(3月)内返回true,希望它有帮助


DateTimeZone::GetTransitions可能会有所帮助。

你可能会振翅高飞:

1
$hasDst = date("I", strtotime('June 1')) !== date("I", strtotime('Jan 1'));

否则,您需要解析基于文本的ZoneInfo数据文件。


日期必须在用户/服务器时区才能工作,并且不能像处理getTransitions那样使用日期范围。


我不这么认为,但由于几乎每个观察DST的国家都会改变一到两个赛季的时间,所以你可以尝试在任何一年内测试4分。

例如,2009/01/01、2009/04/01、2009/07/01和2009/10/01测试date("I", $date)。如果该时区属于DST,则其中至少一个日期将返回1。