2009-09-18 9 views
5

Hay mucha información sobre cómo hacer ajustes de zona horaria en PHP, pero no he encontrado una respuesta específica para lo que quiero hacer debido a todo el ruido.Ajuste de la zona horaria en PHP con DateTime/DateTimeZone

Dado un tiempo en una zona horaria, quiero convertirlo a la hora en otra zona horaria.

This es básicamente lo que quiero hacer, pero necesito poder hacerlo utilizando solo las librerías PHP incorporadas, no la fecha PEAR.

Esto es lo que he estado haciendo, pero me parece dar siempre el desplazamiento relativo a GMT:

$los_angeles_time_zone = new DateTimeZone('America/Los_Angeles'); 
$hawaii_time_zone = new DateTimeZone('Pacific/Honolulu'); 

$date_time_los_angeles = new DateTime('2009-09-18 05:00:00', $los_angeles_time_zone); 
printf("LA Time: %s<br/>", $date_time_los_angeles->format(DATE_ATOM)); 

$time_offset = $hawaii_time_zone->getOffset($date_time_los_angeles); 
printf("Offset: %s<br/>", $time_offset); 

Ésta es la salida:

LA Hora: 2009-09 -18T05: 00: 00-07: 00
Offset: -36000

que estaba esperando 3 horas (10800 segundos). pero la cosa '-7: 00' me dice que mantiene todo lo relativo a GMT, lo que tal vez explique por qué me está dando el offset "absoluto".

¿Cómo obtengo el desplazamiento entre las dos zonas horarias sin todo este GMT hoohah?

Gracias.

ACTUALIZACIÓN:

me ocurrió a mí que yo podía hacer esto y conseguir lo que quiero:

$date_time_los_angeles = new DateTime('2009-09-18 05:00:00', $los_angeles_time_zone); 
printf("LA Time: %s<br/>", $date_time_los_angeles->format(DATE_ATOM)); 

$date_time_hawaii = new DateTime('2009-09-18 05:00:00', $hawaii_time_zone); 
printf("Hawaii Time: %s<br/>", $date_time_hawaii->format(DATE_ATOM)); 


$time_offset = $los_angeles_time_zone->getOffset($date_time_los_angeles) - $hawaii_time_zone->getOffset($date_time_los_angeles); 
printf("Offset: %s<br/>", $time_offset); 

pero se siente incómodo para mí. ¿Alguien sabe una manera más limpia de hacerlo?

Respuesta

8

Aquí hay un par de funciones que usan las clases DateTime. El primero devolverá la diferencia en segundos entre dos zonas horarias. El segundo devuelve una "traducción" del tiempo de una zona horaria a otra.

function timezone_diff($tz_from, $tz_to, $time_str = 'now') 
{ 
    $dt = new DateTime($time_str, new DateTimeZone($tz_from)); 
    $offset_from = $dt->getOffset(); 
    $timestamp = $dt->getTimestamp(); 
    $offset_to = $dt->setTimezone(new DateTimezone($tz_to))->setTimestamp($timestamp)->getOffset(); 
    return $offset_to - $offset_from; 
} 

function time_translate($tz_from, $tz_to, $time_str = 'now', $format = 'Y-m-d H:i:s') 
{ 
    $dt = new DateTime($time_str, new DateTimezone($tz_from)); 
    $timestamp = $dt->getTimestamp(); 
    return $dt->setTimezone(new DateTimezone($tz_to))->setTimestamp($timestamp)->format($format); 
} 

Demostración:

$los_angeles_time = '2009-09-18 05:00:00'; 
$los_angeles_tz = 'America/Los_Angeles'; 
$hawaii_tz  = 'Pacific/Honolulu'; 

$los_angeles_hawaii_diff = timezone_diff($los_angeles_tz, $hawaii_tz, $los_angeles_time); 
echo $los_angeles_hawaii_diff . '<br />'; 

$hawaii_time = time_translate($los_angeles_tz, $hawaii_tz, $los_angeles_time); 
echo $hawaii_time . '<br />'; 
+0

Dicho sea de paso :), estos son para PHP> = 5.3.0. – GZipp

+0

No parecen tener en cuenta el horario de verano. Estoy usando las funciones anteriores para convertir CST en GMT y todos mis tiempos están fuera por 1 hora. –

0

Simplemente menos la primera vez que la segunda.

Que podrá obtener la diferencia de tiempo en términos de segundos.

1

Como se comentó GZipp, su código es realmente sólo para PHP> = 5.3.0. Eso está bien, pero - aquí hay una versión que funcionará en PHP> = 5.2.0. (Por cierto, también funciona en 5.3+, y con 2 llamadas de función menos)

<?php 
function time_translate($tz_from, $tz_to, $time_str = 'now', $format = 'Y-m-d H:i:s') 
{ 
    $dt = new DateTime($time_str, new DateTimezone($tz_from)); 
    $dt->setTimezone(new DateTimezone($tz_to)); 
    return $dt->format($format); 
} 

$time_diffs = array('now', '-1 hour', '-1 day', '-1 week', '-1 month', '+1 hour', '+1 week', '+1 month'); 

foreach ($time_diffs as $diff) 
{ 
echo "{$diff}:" 
    . "\n\t" 
    . "Current: " . date("Y-m-d H:i:s", strtotime($diff)) 
    . "\n\t" 
    . "UTC: " . time_translate("US/Eastern", "UTC", $diff) 
    . "\n\n"; 
} 
+0

Muchas gracias, funciona con la versión php 5.2. Pero si quiero ir con minutos y segundos diff, entonces ¿cuáles deberían ser mis parámetros? Significa una variedad de diferencias de tiempo. – user3305818

+0

el parámetro '$ diff' (' $ time_str') es simplemente una cadena que 'strtotime' entiende, que devolverá una marca de tiempo de unix apropiada. Así que simplemente pase ''-1 minuto o'''' -1 segundo'' o el intervalo que desee.El propósito de esta pregunta/respuesta no era calcular las diferencias en el tiempo o explicar el uso de ['strtotime'] (http://php.net/strtotime), es para convertir una hora en una zona horaria a la hora local en otra zona horaria –

+0

Sus obras. Pero ahora si quiero suministrar todos los parámetros como, 1 día, 3 horas, 10 minutos y 20 segundos antes. Por favor dime. – user3305818