#php #timezone
#php #Часовой пояс
Вопрос:
Я пытался получить имя часового пояса на основе предоставленного смещения UTC, но, похоже, я не могу заставить его работать в течение 30-минутных смещений (т. Е. UTC 09:30)
<?php
function timeZoneTest($input) {
if ($returnValue = timezone_name_from_abbr('', 60 * 60 * $input, 0)) {
return $returnValue;
} else {
return 'Time Zone Not Found';
}
}
echo timeZoneTest(9) . '<br>';
echo timeZoneTest(9.5) . '<br>';
Это возвращает:
Asia/Tokyo
Time Zone Not Found
Разве 9.5 не должен возвращать Australia/Adelaide
или, по крайней мере, допустимый часовой пояс php? Любая помощь будет оценена!
Ответ №1:
Используйте это:
<?php
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;
}
echo tz_offset_to_name(9) . '<br>';
echo tz_offset_to_name(9.5) . '<br>';
?>
Результатом будет:
Asia/Tokyo
Australia/Adelaid
ДЕМОНСТРАЦИЯ
—
timezone_name_from_abbr() иногда возвращает FALSE вместо фактического часового пояса:http://bugs.php.net/44780
Комментарии:
1. Это работает, спасибо! Хотя это дает некоторые странные результаты (-10,-9,-8 все возвращают @America /Anchorage @. Я не ожидал, что разные смещения UTC вернут одно и то же имя часового пояса, но это имеет смысл из-за перехода на летнее время. В связи с этим я буду переосмысливать, как я подхожу к более масштабной проблеме. Кроме того, ошибка, на которую вы ссылались, была закрыта и «исправлена» давным-давно…