Converter deslocamento UTC para fuso horário ou data
Um coçador de cabeça para você.
Eu estou pegando dados geo-IP deIPInfoDBAPI e retorna um deslocamento de fuso horário da UTCIncluindo DST (se atualmente refletido).
Por exemplo, eu moro em EST (-5) e atualmente é DST, então a geo IP API retorna (-04:00
) como o deslocamento.
Isso é maravilhoso desde DST é uma dor de cabeça. Mas para minha surpresa, causou outra dor de cabeça.
Eu carrego esses dados no PHP para serem passados via AJAX para o aplicativo. Eu gostaria de ter a hora local ao vivo do endereço IP no aplicativo.
Eu tenho que tudo pronto perfeitamente, mas eu estou ficando louco tentando descobrir como definir o fuso horário do PHP para coincidir com o deslocamento para que eu possa pegar as horas atuaisdate('H');
e minutosdate('i');
para passar para o AJAX.
Não tenho certeza se existe uma função específica que pode me fornecer as horas e minutos atuais com base nesse deslocamento ou se houver uma maneira prática de definir o fuso horário com base no deslocamento (que já terá o DST aplicado se estiver em vigor) .
Eu pesquisei e pesquisei no Google para encontrar uma resposta para isso, mas o que estou fazendo é mais específico, pois o DST já está aplicado.
Eu encontrei uma função emPHP.net que parece fazer o truque (funciona para o meu fuso horário e retorna a hora correta), embora para outros fusos horários, como o PST, ele esteja retornando 1 hora mais tarde do que deveria, mesmo que o deslocamento esteja correto (-07:00
com DST).
O fuso horário retornado da função éChile/EasterIsland
O que sinto é a causa. Se eu pudesse, eu faria isso funcionar apenas para os EUA, mas eu preciso que seja mundial.
Esta é a função que tenho agora. Por favor, desculpe o código extremamente confuso. Eu tenho jogado com toneladas de coisas nas últimas horas tentando descobrir uma solução.
A maior parte da funcionalidade foi encontrada online.
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;
}
Eu incluí o switch / case para certos fusos horários que são:30
e:45
lá fora. Pode haver uma maneira de incluir isso também sem a necessidade do switch / case.
NOTA: As compensações são sempre devolvidas como tal+00:00
ou-00:00
da API de IP geográfico.
Eu apreciaria qualquer ajuda ou um ponto na direção certa. Eu não sou muito novato com PHP, mas offsets são uma nova história para mim. Obrigado!