如何判断一个时区是否在一年中的任何时间观察夏令时?

在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
    

    我找到了一种使用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年有夏令时..谁知道?),所以此功能检查未来是否存在抵消变化。


    其实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个月(3月)返回true,希望它有帮助


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

    你可以这样做:

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

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

    链接地址: http://www.djcxy.com/p/29355.html

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

    下一篇: Python tzinfo and daylight time