Convertir el desplazamiento UTC en zona horaria o fecha

Un rascador de cabeza para ti.

Estoy tomando datos geo IP deIPInfoDBAPI y devuelve un desplazamiento de zona horaria desde UTCincluso DST (si se refleja actualmente).

Por ejemplo, vivo en EST (-5) y actualmente es DST, por lo que devuelve la API geo IP (-04:00) como el desplazamiento.

Esto es maravilloso ya que el horario de verano es un jodido dolor de cabeza. Pero para mi sorpresa, causó otro dolor de cabeza.

Cargo estos datos en PHP para pasar a través de AJAX a la aplicación. Me gustaría tener la hora local en vivo de la dirección IP en la aplicación.

Lo tengo todo configurado perfectamente, pero me estoy volviendo loco tratando de averiguar cómo configurar la zona horaria de PHP para que coincida con el desplazamiento, así que solo puedo aprovechar las horas actualesdate('H'); y minutosdate('i'); Para pasar a través de AJAX.

No estoy seguro de si hay una función específica que pueda darme las horas y los minutos actuales en función de ese desplazamiento o si existe una forma práctica de establecer la zona horaria en función del desplazamiento (que ya se aplicará el horario de verano si está vigente) .

He estado buscando y buscando en Google para encontrar una respuesta a esto, pero lo que estoy haciendo es más específico ya que el horario de verano ya está aplicado.

Encontré una función enPHP.net eso parece hacer el truco (funciona para mi zona horaria y devuelve la hora correcta) aunque para otras zonas horarias como PST, está regresando 1 hora más tarde de lo que debería ser a pesar de que la compensación es correcta (-07:00 con DST).

La zona horaria devuelta de la función esChile/EasterIsland que tengo un sentimiento es la causa. Si pudiera, haría que esto solo funcionara para los Estados Unidos, pero lo necesito para ser mundial.

Esta es la función que tengo ahora. Por favor, disculpe el código extremadamente desordenado. He estado jugando con un montón de cosas durante las últimas horas tratando de encontrar una solución.

La mayor parte de la funcionalidad se encontró en línea.

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; 
}

Incluí el interruptor / caja para ciertas zonas horarias que están:30 y:45 allí afuera. Puede haber una manera de incluir eso también sin la necesidad del interruptor / caja.

NOTA: Las compensaciones se devuelven siempre como tales.+00:00 o-00:00 de la API geo IP.

Agradecería cualquier ayuda o un punto en la dirección correcta. No soy muy novato con PHP, pero las compensaciones son una nueva historia para mí. ¡Gracias!

Respuestas a la pregunta(8)

Su respuesta a la pregunta