Конвертировать смещение UTC в часовой пояс или дату

Головной скребок для тебя.

Я получаю данные гео IP сIPInfoDBAPI и возвращает смещение часового пояса от UTCincluding Летнее время (если в настоящее время отражено).

Например, я живу в EST (-5) и в настоящее время это DST, поэтому API Geo IP возвращает (-04:00) в качестве смещения.

Это замечательно, так как летнее время - головная боль. Но, к моему удивлению, это вызвало еще одну головную боль.

Я загружаю эти данные в PHP для передачи через приложение AJAX. Я хотел бы, чтобы в приложении было указано местное время IP-адреса.

У меня все отлично настроено, но я схожу с ума, пытаясь понять, как установить часовой пояс PHP, чтобы соответствовать смещению, чтобы я мог просто взять текущие часыdate('H'); и минутыdate('i'); перейти через AJAX.

Я не уверен, есть ли конкретная функция, которая может просто дать мне текущие часы и минуты, основанные на этом смещении, или есть практический способ установить часовой пояс на основе смещения (к которому уже применяется DST, если он действует) ,

Я искал и искал в Google, чтобы найти ответ на этот вопрос, но то, что я делаю, является более конкретным, поскольку DST уже применяется.

Я нашел одну функцию наPHP.net это, кажется, делает трюк (он работает для моего часового пояса и возвращает правильное время), хотя для других часовых поясов, таких как PST, он возвращается на 1 час позже, чем должен быть, даже если смещение является правильным (-07:00 с DST).

Часовой пояс, возвращаемый функциейChile/EasterIsland что у меня есть чувство, это причина. Если бы я мог, я бы сделал это только для США, но мне нужно, чтобы это было по всему миру.

Это функция, которую я имею сейчас. Пожалуйста, извините за чрезвычайно грязный код. В последние несколько часов я играл с кучей вещей, пытаясь найти решение.

Большая часть функционала была найдена онлайн.

function offsetToTZ($offset) {
switch((string) $offset) {
    case '-04:30' : return 'America/Caracas'; break;
    case '-03:30' : return 'Canada/Newfoundland'; break;
    case '+03:30' : return 'Asia/Tehran'; break;
    case '+04:30' : return 'Asia/Kabul'; break;
    case '+05:30' : return 'Asia/Kolkata'; break;
    case '+05:45' : return 'Asia/Kathmandu'; break;
    case '+09:30' : return 'Australia/Darwin'; break;
}
$offset = (int) str_replace(array('0',0,':00',00,'30',30,'45',45,':','+'),'', (string) $offset);

$offset = $offset*60*60;
$abbrarray = timezone_abbreviations_list(); 
foreach ($abbrarray as $abbr) { 
    foreach($abbr as $city) { 
        if($city['offset'] == $offset) { 
            return $city['timezone_id'];
        }
    }
}
return false; 
}

Я включил переключатель / чехол для определенных часовых поясов, которые:30 а также:45 там Может быть способ включить это также без необходимости переключения / случая.

NOTE: Смещения всегда возвращаются как таковые+00:00 или же-00:00 из API гео IP.

Буду признателен за любую помощь или точку в правильном направлении. Я не очень новичок в PHP, но смещение - это новая история для меня. Спасибо!

Ответы на вопрос(8)

Ваш ответ на вопрос