首页 文章

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

提问于
浏览
12

在PHP中,您可以通过使用以下内容来判断给定日期是否在夏令时期间:

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

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


编辑澄清:

  • 澳大利亚布里斯班在一年中的任何时候都没有观察到夏令时 . 全年都是GMT 10 .

  • 澳大利亚悉尼从10月到3月,从格林威治标准时间10改为格林威治标准时间11 .

我想知道是否会有一些现有的方法,或者一种方法来实现一个如此工作的方法:

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

5 回答

  • 0

    我找到了一个使用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年有夏令时......谁知道?),因此该功能检查未来是否存在偏移变化 .

  • 3

    实际上,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,希望它有所帮助

  • 10

    DateTimeZone::getTransitions可能有所帮助 .

    你可能会翼到它:

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

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

  • 0

    我不这么认为,但由于几乎所有观察夏令时的国家都会改变整整一个赛季的时间,所以你可以尝试在任何一年中测试4分 .

    例如,测试2009/01/01,2009 / 04 / 01,2009 / 07/01和2009/10/01的 date("I", $date) . 如果该时区属于DST,那么这些日期中至少有一个将返回1 .

  • 14

    date必须位于用户/服务器时区才能工作,并且您不能像使用getTransitions那样使用带日期的范围

相关问题