2011-04-27 28 views
17

del entorno de servidorPHP UTC a la hora local

RedHat Enterprise Linux
PHP 5.3.5

Problema

Digamos que tengo una fecha y hora UTC como 2011-04 -27 02:45 y quiero convertirlo a mi hora local, que es America/New_York.

Tres preguntas:

1.) Mi código de abajo podría resolver el problema, ¿está de acuerdo?

<?php 

date_default_timezone_set('America/New_York'); // Set timezone. 

$utc_ts = strtotime("2011-04-27 02:45"); // UTC Unix timestamp. 

// Timezone offset in seconds. The offset for timezones west of UTC is always negative, 
// and for those east of UTC is always positive. 
$offset = date("Z"); 

$local_ts = $utc_ts + $offset; // Local Unix timestamp. Add because $offset is negative. 

$local_time = date("Y-m-d g:i A", $local_ts); // Local time as yyyy-mm-dd h:m am/pm. 

echo $local_time; // 2011-04-26 10:45 PM 

?> 

2.) Pero, ¿el valor de $ offset se ajusta automáticamente para el horario de verano (DST)?
3.) Si no es así, ¿cómo debo ajustar mi código para ajustar automáticamente el horario de verano?

Gracias :-)

+2

¿Lo intentó? – wallyk

+0

'date (" Z ")' siempre devuelve la zona horaria 'GMT + 0000', que no tiene corrección para el horario de verano. –

Respuesta

32

Esto va a hacer lo que desee con los PHP nativas DateTime y DateTimeZone clases:

$utc_date = DateTime::createFromFormat(
       'Y-m-d G:i', 
       '2011-04-27 02:45', 
       new DateTimeZone('UTC') 
); 

$nyc_date = $utc_date; 
$nyc_date->setTimeZone(new DateTimeZone('America/New_York')); 

echo $nyc_date->format('Y-m-d g:i A'); // output: 2011-04-26 10:45 PM 

Ver DateTime::createFromFormat man page para más información.

Después de algunos experimentos entre time zones that do and do not currently have DST, he descubierto que esto tendrá en cuenta el horario de verano. La misma conversión usando mi método anterior representa el mismo tiempo resultante.

+1

Esta es también la razón por la cual PHP tiene como 7 husos horarios diferentes para el estado de Indiana, para dar cuenta de todas sus locas reglas DST diferentes: http://php.net/manual/en/timezones.php –

+0

Todo: Realmente aprecio la ayuda de todos . Treffynnon: ¡Gracias! Voy a darle una oportunidad. Mi código parece tan primitivo en comparación con el tuyo, jaja. ¿Estaba incluso cerca en mi intento? ¡Gracias de nuevo! – John

+0

@John te alegra que te guste. No estoy seguro acerca de su código ya que nunca lo escribí de esa manera con el estilo de PHP de procedimiento. – Treffynnon

0
date_default_timezone_set('America/New_York'); // Set timezone. 
$utc_ts = strtotime("2011-04-27 02:45"); // UTC Unix timestamp. 

Sólo después de esta ejecución de este, $ utc_ts contiene la hora local. PHP maneja el DST mismo.

= H =

+1

Esto no convierte el tiempo entre zonas horarias. Simplemente crea una nueva marca de tiempo de Unix para '2011-04-27 02: 45'. La zona horaria en su ejemplo no hace nada en este caso y es inconsecuente. – Treffynnon

+2

No hay tal cosa como la marca de tiempo UTC porque la marca de tiempo no se ve afectada por la zona horaria. Puede establecer cualquier zona horaria en la primera línea y $ utc_ts devolverá el mismo valor.Este código no hace más que establecer la zona horaria para su uso futuro en el script, no afecta a la marca de tiempo en sí. – Wh1T3h4Ck5

3

Sé que esta es una publicación anterior, pero hay otra línea que debe agregar para obtener la hora correcta.

Antes de la conversión a la hora local, es necesario establecer la zona horaria predeterminada a UTC como esto (si se trata de la zona horaria del tiempo que está proporcionando):

function GmtTimeToLocalTime($time) { 
    date_default_timezone_set('UTC'); 
    $new_date = new DateTime($time); 
    $new_date->setTimeZone(new DateTimeZone('America/New_York')); 
    return $new_date->format("Y-m-d h:i:s"); 
} 
0

voy a mejorar en Hasin la respuesta de Hayder

date_default_timezone_set('America/New_York'); // Set timezone. 
$utc_ts = strtotime("2011-04-27 02:45 UTC"); // UTC Unix timestamp. 
echo date('Y-m-d H:i:s a T', $utc_ts); 

debe salida

2011-04-26 10:45:00 pm EDT 

la diferencia es la adición de la s zona horaria strtotime() también acepta la zona horaria. : p

Cuestiones relacionadas