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!

questionAnswers(8)

yourAnswerToTheQuestion