Головокружение для вас.
Я получаю данные о географическом 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, но смещения для меня новая история. Спасибо!