• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • DateTimeZone::getTransitions()

    timezone_transitions_get

    (PHP 5 >= 5.2.0, PHP 7)

    Returns all transitions for the timezone

    说明

    面向对象风格
    publicDateTimeZone::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.0The 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);
    }