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"
?>
timezone_name_from_abbr
(PHP 5 >= 5.1.3)
timezone_name_from_abbr — Devuelve el nombre de la zona horaria desde su abreviatura
Descripción
$abbr
[, int $gmtOffset = -1
[, int $isdst = -1
]] )Parámetros
-
abbr -
La abreviatura de la zona horaria.
-
gmtOffset -
Índice de GMT en segundos. Por defecto es -1 lo que significa que la primera zona horaria buscada que se corresponda con
abbres devuelta. De otro modo se busca el índice exacto y, sólo si no se encuentra, se devuelve la priemra zona horaria con cualquier índice. -
isdst -
Indicador del horario de verano. Por defecto a -1, lo que significa que si la zona horaria tiene horario de verano no se toma encosideración en la búsqueda. Si está establecido a 1, entonces se asuma que el parámetro
gmtOffsetes un índice con el horario de verano en efecto; si es 0, entonces se asume quegmtOffsetes un índice sin horario de verano en efecto. Siabbrno existe, la zona horaria se busca únicamente mediantegmtOffsetyisdst.
Valores devueltos
Devuelve el nombre de la zona horaria si se tuvo éxito o FALSE en caso de error.
Ejemplos
Ejemplo #1 Un ejemplo de timezone_name_from_abbr()
<?php
echo timezone_name_from_abbr("CET") . "\n";
echo timezone_name_from_abbr("", 3600, 0) . "\n";
?>
El resultado del ejemplo sería algo similar a:
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;
}
?>
