ошибка timezone_name_from_abbr со смещением на 30 минут

#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
  

ДЕМОНСТРАЦИЯ

https://repl.it/EBSO/0

timezone_name_from_abbr() иногда возвращает FALSE вместо фактического часового пояса:http://bugs.php.net/44780

Комментарии:

1. Это работает, спасибо! Хотя это дает некоторые странные результаты (-10,-9,-8 все возвращают @America /Anchorage @. Я не ожидал, что разные смещения UTC вернут одно и то же имя часового пояса, но это имеет смысл из-за перехода на летнее время. В связи с этим я буду переосмысливать, как я подхожу к более масштабной проблеме. Кроме того, ошибка, на которую вы ссылались, была закрыта и «исправлена» давным-давно…