如何判断一个时区在一年中的任何时间实行夏令?(How to tell if a timezone o

2019-08-20 03:39发布

在PHP中,你可以告诉我们,如果一个给定的日期是在使用像这样的夏令时间段:

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

问题是,这只是告诉你的时刻,一个点是否在DST。 有没有检查DST是否有效在该时区的任何时间一个可靠的方式吗?


编辑澄清:

  • 布里斯班,澳大利亚不会在任何一年的时间观察夏令时。 全年各地,它是GMT + 10。
  • 澳大利亚悉尼的确,从10月到3月,当它GMT + 10〜GMT + 11的变化。

我想知道是否会有一些现有的方法,或者实现其工作方式这样的方法方式:

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

Answer 1:

我发现这些作品使用PHP的DateTimezone类(PHP 5.2+)的方法

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

或者,如果你正在运行PHP 5.3+

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

getTransitions()功能让你每次约信息的偏移一个时区的变化。 这包括历史数据(布里斯曾在1916年夏令..谁知道?),所以此功能检查,如果有一个在未来或不偏移的变化。



Answer 2:

其实nickf方法不适合我的工作,所以我重新设计了一点...

/**
* Finds wherever a TZ is experimenting dst or not
* @author hertzel Armengol <emudojo @ gmail.com>
* @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个月后返回true(三月),希望它有助于



Answer 3:

DateTimeZone :: getTransitions可能的帮助。

你也许可以翼它:

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

否则,你需要解析基于文本的区信息的数据文件。



Answer 4:

我不这么认为,但由于几乎每一个国家,观察DST改变其时间一整个赛季或两个,你可以尝试在任何一年中测试了4分。

例如,测试date("I", $date)为2009/01/01,2009/04/01,2009/07/01和2009/10/01。 如果该时区分为DST,这些日期的则至少有一个会返回1。



Answer 5:

日期必须是用户/服务器的时区,它的工作,并为您getTransitions你不能使用范围与日期



文章来源: How to tell if a timezone observes daylight saving at any time of the year?