如何确定给定日期是夏令时生效的日期?

时间:2014-03-11 13:18:17

标签: php timezone

  • PHP时区设置为America / New_York
  • 服务器在EDT
  • 所有访问服务器的客户都在EDT

今年,2014年3月9日凌晨2点,时间推迟了一小时。

我知道我可以使用date('I');确定我们是否处于DST状态。我需要做的是确定今天是否是DST(春季或秋季)的第一天

我正在寻找以下内容:

function isFirstDayOfDST($date) {
    //Return true if today is FIRST day of DST 
}

echo isFirstDayOfDST('2013-03-09');
//true

echo isFirstDayOfDST('2013-03-10');
//false

这是我可以通过编程方式执行的操作,还是需要维护DST日期的内部日历?


更新

基于@ MarcB的评论DateTimeZone::getTransitions看起来它让我得到了我需要的东西,特别是那个来自rubo77的页面上的例子。

function getTransitionsForYear($year=null, $tz = null){
    if(!$year) $year=date("Y");

    if (!$tz) $tz = date_default_timezone_get();
    $timeZone = new DateTimeZone($tz);

    if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
        $transitions = $timeZone->getTransitions(mktime(0, 0, 0, 2, 1, $year),mktime(0, 0, 0, 11, 31, $year));
        $index=1;
    } else {
        // since 1980 it is regular, the 29th element is 1980-04-06
            // change this in your timezone
            $first_regular_index=29;
            $first_regular_year=1980;
        $transitions = $timeZone->getTransitions();
        $index=($year-$first_regular_year)*2+$first_regular_index;
    }
    $temp   = array_slice($transitions, $index, 2);
    $spring = explode('T', $t[0]['time']);
    $fall   = explode('T', $t[1]['time']);

    $dates = array();
    $dates['spring'] = $spring[0];
    $dates['fall'] = $fall[0];

    return $dates;
};

正在运行$dates = getTransitionsForYear('2014', 'America/New_York');让我:

Array
(
    [spring] => 2014-03-09
    [fall] => 2014-11-02
)

我已经测试了2015年,2016年和2017年,所有工作都按预期进行。

1 个答案:

答案 0 :(得分:0)

@Marc B的评论回答了这个问题。 " php.net/manual/en/datetimezone.gettransitions.php应该告诉你。 - Marc B"

由于他没有给出答案,我自己回答并按照此处所述标记CW:Question with no answers, but issue solved in the comments (or extended in chat)