3

“美国/纽约”的时钟变化:
当当地时间即将到达
2013 年 11 月 3 日星期日 02:00:00 时,时钟拨回 1 小时至
2013 年 11 月 3 日星期日 01:00:00 当地标准时间反而

“欧洲/柏林”的时钟变化:
当当地时间即将到达
2013 年 10 月 27 日星期日 03:00:00 时,时钟向后调转 1 小时至
2013 年 10 月 27 日星期日,改为当地时间 02:00:00

如何使用 PHP 获取这些日期?
例如:如何在没有谷歌的情况下获得柏林 2014 年的日期“2013 年 10 月 27 日,02:00:00”;)

如果我在那个小时内有一个 unixtimestamp,它会指向第一个小时还是最后一个小时?

4

2 回答 2

3

我认为getTransitions这就是你所追求的:

$timezone = new DateTimeZone("Europe/London");
$transitions = $timezone->getTransitions();

我承认,这看起来有点碍眼,如果您对数组中返回多个条目的原因感到困惑,那是因为确切的日期不同,因为在大多数地区它是基于星期几一个月(例如“十月的最后一个星期日”)而不是特定日期。对于上述情况,如果您只想要即将到来的转换,您可以添加 timestamp_being 参数:

$timezone = new DateTimeZone("Europe/London");
$transitions = $timezone->getTransitions(time());
于 2013-11-14T04:32:06.217 回答
2

getTransitions您一起获得所有转换(从 php 5.3 开始和结束)

这适用于 PHP < 5.3

<?php
/** returns an array with two elements for spring and fall DST in a given year
 *  works in PHP_VERSION < 5.3
 * 
 * @param integer $year
 * @param string $tz timezone
 * @return array
 **/
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;
    }
    return array_slice($transitions, $index, 2);
}
于 2013-11-14T05:34:53.783 回答