2009-10-13 17 views
5

He estado leyendo acerca de cómo hacer esto toda la mañana, y el consenso general es el siguiente: almacene sus marcas de tiempo en UTC y calcule el desplazamiento desde allí.Visualización de zonas horarias sin utilizar UTC

Sin embargo, como la mayoría de las personas, estoy manteniendo una base de código existente y no puedo cambiar la forma en que almacenamos nuestras fechas. Al menos, no en el marco de tiempo asignado.

Así que mi pregunta es, ¿puedo hacer algo como esto de forma segura?

// this is my time zone 
$timestamp = strtotime($timestampFromDatabase); 
date_default_timezone_set('America/New York'); 
$tz = date_default_timezone_get(); 

// this is theoretically their timezone, which will eventually 
// be taken from a session variable 
date_default_timezone_set('Europe/Paris'); 
$offset = time() - $timestamp; 
$timestamp -= $offset; 

// now that I have the offset, display dates like this 
date('r', $timestamp); 

Algunas personas han desaconsejado hacer aritmética de fecha, pero ¿eso es lo que estoy haciendo aquí mal? ¿Hay una mejor manera? ¿Hay riesgos de los que debo tener cuidado? Estoy particularmente interesado en qué tipo de errores podría producir este método y, en su caso, ¿a quién afectarán?

Mi jefe es el tipo de persona que no le importa si el error solo afecta al 1% de la base de usuarios.

Editar: ¿Puedo aclarar esto? No parece tener demasiados interesados ​​en esto. ¿Nadie? Incluso una sugerencia vaga o un enlace sería inmensamente útil.

Respuesta

5

La respuesta corta es que las zonas horarias son difíciles de trabajar y nadie quiere hacer frente a las preguntas difíciles.

Cuanto más larga sea, la respuesta es la siguiente:

En primer lugar, es necesario crear una representación de su fecha, en sus zonas horarias actuales. Los siguientes son equivalentes:

date_default_timezone_set('America/New York'); 

$date = new DateTime(null); 

O

$date = new DateTime(null, new DateTimeZone('America/New York')); 

Esto le da una cita con la zona de ajuste a América/Nueva York. Podemos convertir fácilmente al usuario la zona horaria, en este caso Europa/París con la siguiente línea:

$date->setTimezone(new DateTimeZone('Europe/London')); 

Usted puede utilizar la siguiente línea para obtener la fecha/hora representado en cualquier punto.

echo $date->format('d/m/Y H:i:s'); 

I fuertemente recomendar esta sobre la aritmética, como el construido en funciones de PHP tiene conocimiento de horario de verano automáticamente y un montón de cosas complicadas que no te vas a la derecha.


Mi escritura de la prueba en su totalidad:

date_default_timezone_set('America/Belize'); 

$date = new DateTime(null); 

echo $date->format('d/m/Y H:i:s') . '<br>'; 

$date->setTimezone(new DateTimeZone('Europe/London')); 

echo $date->format('d/m/Y H:i:s') . '<br>'; 
+0

También podría utilizar este método para actualizar su base de datos a la hora UTC en un fuera de trabajo para su uso futuro. –

+0

Esto es increíble. Sin embargo, supongamos que ejecuto PHP 5.14, que no tiene este objeto. ¿Hay otra manera? –

+0

Zend Framework tiene una solución basada en php en Zend_Date, pero solicita PHP 5.2.4 como requisito general para el framework. Podría funcionar. ¿Puedes actualizar o recompilar PHP? –

Cuestiones relacionadas