Algunos problemas con las zonas horarias en PHP han estado en mi mente por un tiempo, y me preguntaba si hay mejores maneras de manejarlos que lo que estoy haciendo actualmente.Tratando con husos horarios en PHP
Todos los temas giran en torno a reformating base de datos almacenada fechas:
Cuando se trata de un sitio que tiene que soportar múltiples zonas horarias (para los usuarios), para normalizar la offest zona horaria de marcas de tiempo almacenados siempre almacenarlo con el servidor zona horaria utilizando el atributo CURRENT_TIMESTAMP
o la función NOW()
.
De esta manera no tengo que considerar qué zona horaria se estableció para PHP cuando se ingresó la marca de tiempo (ya que las funciones de hora de PHP tienen en cuenta la zona horaria). Para cada usuario, de acuerdo con su preferencia puedo configurar la zona horaria en algún lugar de mi archivo de arranque usando:
date_default_timezone_set($timezone);
cuando estoy buscando para formatear fechas con la función php date()
, alguna forma de conversión tiene que tener lugar desde MySQL actualmente almacena la marca de tiempo en el formato Y-m-d H:i:s
. Sin tener en cuenta la zona horaria, puede simplemente ejecutar:
$date = date($format,strtotime($dbTimestamp));
El problema con esto es que date()
y strtotime()
son ambas zonas horarias funciones conscientes, lo que significa que si la zona horaria PHP está configurado de manera diferente desde el servidor de zona horaria, la zona horaria compensado se aplicará dos veces (en lugar de una vez como quisiéramos).
Para resolver esto, suelo recuperar las marcas de tiempo de MySQL utilizando la función UNIX_TIMESTAMP()
que no reconoce la zona horaria, lo que me permite aplicar date()
directamente sobre ella, aplicando el desplazamiento de zona horaria solo una vez.
Realmente no me gusta este 'truco' porque ya no puedo recuperar esas columnas como lo haría normalmente, o uso *
para buscar todas las columnas (a veces simplifica las consultas). Además, a veces simplemente no es una opción usar UNIX_TIMESTAMP()
(especialmente cuando se usa con paquetes de código abierto sin mucha abstracción para la composición de consultas).
Otro problema es cuando se almacena la marca de tiempo, cuando el uso de CURRENT_TIMESTAMP
o NOW()
no es una opción: almacenar una marca de tiempo generada PHP la almacenará con el desplazamiento de la zona horaria que me gustaría evitar.
Probablemente me falta algo muy básico aquí, pero hasta ahora no he podido encontrar una solución genérica para manejar esos problemas, así que estoy obligado a tratarlos caso por caso. Sus pensamientos son bienvenidos
Para cualquiera que encuentre esta pregunta y quiera leer sobre el tema: http://stackoverflow.com/questions/2532729/daylight-saving-time-and-timezone-best-practices – Industrial