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_abbreviations_list()
别名 DateTimeZone::listAbbreviations
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.