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);
}