DateTimeZone::getTransitions()
timezone_transitions_get
(PHP 5 >= 5.2.0, PHP 7)
Returns all transitions for the timezone
说明
面向对象风格public DateTimeZone::getTransitions([int $timestamp_begin=PHP_INT_MIN
[,int $timestamp_end=PHP_INT_MAX
]]): array
过程化风格
timezone_transitions_get(DateTimeZone$object[,int $timestamp_begin=PHP_INT_MIN
[,int $timestamp_end=PHP_INT_MAX
]]): array
参数
- $object
仅过程化风格:由timezone_open()返回的DateTimeZone对象。
- $timestamp_begin
Begin timestamp.
- $timestamp_end
End timestamp.
返回值
Returns numerically indexed array containing associative array with all transitions on success 或者在失败时返回FALSE
.
更新日志
版本 | 说明 |
---|---|
5.3.0 | The optional$timestamp_beginand$timestamp_endwere added. |
范例
Atimezone_transitions_get()example
<?php $timezone = new DateTimeZone("Europe/London"); $transitions = $timezone->getTransitions(); print_r(array_slice($transitions, 0, 3)); ?>
以上例程的输出类似于:
Array ( [0] => Array ( [ts] => -9223372036854775808 [time] => -292277022657-01-27T08:29:52+0000 [offset] => 3600 [isdst] => 1 [abbr] => BST ) [1] => Array ( [ts] => -1691964000 [time] => 1916-05-21T02:00:00+0000 [offset] => 3600 [isdst] => 1 [abbr] => BST ) [2] => Array ( [ts] => -1680472800 [time] => 1916-10-01T02:00:00+0000 [offset] => 0 [isdst] => [abbr] => GMT ) )
Getting a timezone's offset and other data at a specified point in time (now, for example) using the new PHP5.3 parameters: <?php $theTime = time(); # specific date/time we're checking, in epoch seconds. $tz = new DateTimeZone('America/Los_Angeles'); $transition = $tz->getTransitions($theTime,$theTime); # only one array should be returned into $transition. Now get the data: $offset = $transition[0]['offset']; $abbr = $transition[0]['abbr']; ?> Before PHP5.3, you'd have to loop through all of the Transitions up until the current point in time, which would be a very inefficient process.
This will work in PHP_VERSION < 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); }
Beware if you use getTransitions() without a minimum date, it can be slow...
This function will work in PHP < 5.3 : /** returns an array with two elements for spring and fall DST in a given year * * @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); $transitions = $timeZone->getTransitions(mktime(0, 0, 0, 1, 1, $year)); return array_slice($transitions, 1, 2); }