Хвост для головы.
Я захватываю геоинтерфейсные данные из IPInfoDB API и возвращает смещение часового пояса от UTC , включая DST (если в настоящее время отражено).
Например, я живу в EST (-5) и в настоящее время это DST, поэтому geo IP API возвращает (-04:00
) в качестве смещения.
Это замечательно, так как DST - это страшная головная боль. Но, к моему удивлению, это вызвало еще одну головную боль.
Я загружаю эти данные в 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
там. Может быть способ включить это также без необходимости переключения/случая.
ПРИМЕЧАНИЕ. Смещения всегда возвращаются как таковые +00:00
или -00:00
из геоинтерфейса IP.
Буду признателен за любую помощь или точку в правильном направлении. Я не очень начинаю с PHP, но смещения - это новая история для меня. Спасибо!