Преобразование смещения UTC в часовой пояс или дату

Головокружение для вас.

Я получаю данные о географическом IP-адресе из IPInfoDB API, и он возвращает смещение часового пояса от UTC , включая DST (, если в настоящее время отражено ).

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

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

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

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

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

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

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

Часовой пояс, возвращаемый функцией, равен 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. Может быть способ включить это также без необходимости переключателя/кейса.

ПРИМЕЧАНИЕ:Смещения всегда возвращаются как таковые +00:00или -00:00из API географического IP.

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

15
задан uınbɐɥs 7 October 2012 в 20:29
поделиться