PHP Velho Oeste 2024

DateTimeZone::getTransitions

timezone_transitions_get

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DateTimeZone::getTransitions -- timezone_transitions_getLiefert alle Übergänge einer Zeitzone

Beschreibung

Objektorientierter Stil

public DateTimeZone::getTransitions(int $timestampBegin = PHP_INT_MIN, int $timestampEnd = PHP_INT_MAX): array|false

Prozeduraler Stil

timezone_transitions_get(DateTimeZone $object, int $timestampBegin = PHP_INT_MIN, int $timestampEnd = PHP_INT_MAX): array|false

Parameter-Liste

object

Nur bei prozeduralem Aufruf: Ein von date_create() zurückgegebenes DateTimeZone-Objekt.

timestampBegin

Der Zeitstempel des Beginns

timestampEnd

Der Zeitstempel des Endes

Rückgabewerte

Gibt bei Erfolg ein numerisch indiziertes Array von Übergangs-Arrays zurück. Bei einem Fehler wird false zurückgegeben. DateTimeZone-Objekte des Typs 1 (UTC-Offsets) und des Typs 2 (Abkürzungen) enthalten keine Übergänge und der Aufruf dieser Methode für sie gibt false zurück.

Wenn timestampBegin angegeben wird, enthält der erste Eintrag im zurückgegebenen Array Informationen über den Übergang zum Zeitpunkt timestampBegin.

Array-Struktur der Übergänge
Schlüssel Typ Beschreibung
ts int Unix-Zeitstempel
time string Zeichenkette im Format DateTimeInterface::ISO8601_EXPANDED (ab PHP 8.2) oder DateTimeInterface::ISO8601 (bis einschließlich PHP 8.1)
offset int Abweichung von der UTC in Sekunden
isdst bool Gibt an, ob es eine Sommerzeit gibt
abbr string Kurzbezeichnung der Zeitzone

Beispiele

Beispiel #1 timezone_transitions_get()-Beispiel

<?php
$timezone
= new DateTimeZone("Europe/London");
$transitions = $timezone->getTransitions();
print_r(array_slice($transitions, 0, 3));
?>

Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:

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
        )

)

Beispiel #2 timezone_transitions_get()-Beispiel mit gesetztem timestampBegin

<?php
$timezone
= new DateTimeZone("Europe/London");
$transitions = $timezone->getTransitions(time());
print_r(array_slice($transitions, 0, 3));
?>

Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:

Array
(
    [0] => Array
        (
            [ts] => 1654184161
            [time] => 2022-06-02T15:36:01+0000
            [offset] => 3600
            [isdst] => 1
            [abbr] => BST
        )

    [1] => Array
        (
            [ts] => 1667091600
            [time] => 2022-10-30T01:00:00+0000
            [offset] => 0
            [isdst] =>
            [abbr] => GMT
        )

    [2] => Array
        (
            [ts] => 1679792400
            [time] => 2023-03-26T01:00:00+0000
            [offset] => 3600
            [isdst] => 1
            [abbr] => BST
        )

)

add a note add a note

User Contributed Notes 4 notes

up
9
scotts
14 years ago
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.
up
4
rubo77
10 years ago
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);
}
up
1
tanguy dot pruvot at gmail dot com
10 years ago
Beware if you use getTransitions() without a minimum date, it can be slow...
up
-3
rubo77
10 years ago
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);
}
To Top