• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • timezone_name_from_abbr()

    (PHP 5 >= 5.1.3, PHP 7)

    Returns the timezone name from abbreviation

    说明

    timezone_name_from_abbr(string $abbr[,int $gmtOffset=-1[,int $isdst=-1]]): string

    参数

    $abbr

    Time zone abbreviation.

    $gmtOffset

    Offset from GMT in seconds. Defaults to -1 which means that first found time zone corresponding to$abbris returned. Otherwise exact offset is searched and only if not found then the first time zone with any offset is returned.

    $isdst

    Daylight saving time indicator. Defaults to -1, which means that whether the time zone has daylight saving or not is not taken into consideration when searching. If this is set to 1, then the$gmtOffsetis assumed to be an offset with daylight saving in effect; if 0,then$gmtOffsetis assumed to be an offset without daylight saving in effect.If$abbrdoesn't exist then the time zone is searched solely by the$gmtOffsetand$isdst.

    返回值

    Returns time zone name on success 或者在失败时返回FALSE.

    范例

    Atimezone_name_from_abbr()example

    <?php
    echo timezone_name_from_abbr("CET") . "\n";
    echo timezone_name_from_abbr("", 3600, 0) . "\n";
    ?>
    

    以上例程的输出类似于:

    Europe/Berlin
    Europe/Paris
    

    参见

    timezone_name_from_abbr() sometimes returns FALSE instead of an actual timezone: http://bugs.php.net/44780
    It's possible to workaround it for some cases by getting the timezone name from timezone_abbreviations_list(). For example, if you have the GMT offset and want a timezone name:
    <?php
    /* Takes a GMT offset (in hours) and returns a timezone name */
    function tz_offset_to_name($offset)
    {
        $offset *= 3600; // convert hour offset to seconds
        $abbrarray = timezone_abbreviations_list();
        foreach ($abbrarray as $abbr)
        {
            foreach ($abbr as $city)
            {
                if ($city['offset'] == $offset)
                {
                    return $city['timezone_id'];
                }
            }
        }
        return FALSE;
    }
    ?>
    
    In some cases, timezone_name_from_abbr() may return a "historical" (i.e. deprecated) timezone identifier rather than the current standard one for a given location. For example:
    <?php
    echo timezone_name_from_abbr('EASST'); // prints "Chile/EasterIsland" instead of "Pacific/Easter"
    ?>
    This means that the returned timezone identifier is not guaranteed to be in the results of timezone_identifiers_list() unless you include the "backwards compatible" timezones.
    <?php
    var_dump(in_array(timezone_name_from_abbr('EASST'), timezone_identifiers_list())); // (bool)false
    var_dump(in_array(timezone_name_from_abbr('EASST'), timezone_identifiers_list(DateTimeZone::ALL_WITH_BC))); // (bool)true
    ?>
    
    Another way to do this is to wrap the function in a class that extends the DateTimeZone class:
    <?php
    /**
     * Helps with timezones.
     * @link http://us.php.net/manual/en/class.datetimezone.php
     *
     * @package Date
     */
    class Helper_DateTimeZone extends DateTimeZone
    {
      /**
       * Converts a timezone hourly offset to its timezone's name.
       * @example $offset = -5, $isDst = 0 <=> return value = 'America/New_York'
       * 
       * @param float $offset The timezone's offset in hours.
       *           Lowest value: -12 (Pacific/Kwajalein)
       *           Highest value: 14 (Pacific/Kiritimati)
       * @param bool $isDst Is the offset for the timezone when it's in daylight
       *           savings time?
       * 
       * @return string The name of the timezone: 'Asia/Tokyo', 'Europe/Paris', ...
       */
      final public static function tzOffsetToName($offset, $isDst = null)
      {
        if ($isDst === null)
        {
          $isDst = date('I');
        }
        $offset *= 3600;
        $zone  = timezone_name_from_abbr('', $offset, $isDst);
        if ($zone === false)
        {
          foreach (timezone_abbreviations_list() as $abbr)
          {
            foreach ($abbr as $city)
            {
              if ((bool)$city['dst'] === (bool)$isDst &&
                strlen($city['timezone_id']) > 0  &&
                $city['offset'] == $offset)
              {
                $zone = $city['timezone_id'];
                break;
              }
            }
            if ($zone !== false)
            {
              break;
            }
          }
        }
      
        return $zone;
      }
    }
    ?>
    Then you could do something like this:
    <?php
    $Dtz = new Helper_DateTimeZone(Helper_DateTimeZone::tzOffsetToName(-5));
    var_dump($Dtz->getName());
    string(16) "America/New_York"
    ?>
    
    Fun fact: (60*60) * -2 always seems to return null.
    Perhaps because there's no timezone that corresponds to UTC -2.