Конвертировать смещение 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, но смещение - это новая история для меня. Спасибо!