Obviamente, el salto al horario de verano británico (horario de verano) es una gran confusión en el mundo de la programación, y estoy atrapado en esa confusión.
La mejor solución posible que pueda encontrar (que voy a tratar de explicar coherentemente) cuando se utiliza un sistema sensible zona horaria es la siguiente:
- el servidor web y base de datos deben ser a la vez se salga de la misma zona horaria máquina. Sugiero UTC, ya que es el componente básico de las conversiones de zona horaria. Esto asegurará que todas las fechas almacenadas en su base de datos sean constantes, y no omita ningún momento, como el salto de 1 hora entre Horario de verano.
- En la parte superior de todos sus scripts PHP, use
date_default_timezone_set('Europe/London');
con la zona horaria específica del usuario.
-
Al producir fechas de formularios enviados por el usuario, use
gmmktime();
para asegurarse de que la marca de tiempo creada sea UTC y no la modifique la zona horaria que ha establecido.
date();
se puede utilizar al mostrar las fechas, ya que esto convertirá la marca de tiempo en la hora correcta teniendo en cuenta la zona horaria que ha configurado.
-
Si necesita mostrar una fecha en el formato UTC, utilice
gmdate();
con
$gm_timestamp
que haya tomado de la base de datos o creado con
gmmktime();
.
He escrito este pedacito de PHP para ayudar a entender la situación.
date_default_timezone_set('UTC');
$gmtime = gmmktime(2,0,0,03,29,2009);
$time = mktime(2,0,0,03,29,2009);
echo $gmtime.'<br />'.date('r',$gmtime).'<br />'.gmdate('r',$gmtime).'<br />';
echo $time.'<br />'.date('r',$time).'<br />'.gmdate('r',$time).'<br />';
date_default_timezone_set('Europe/London');
$gmtime = gmmktime(2,0,0,03,29,2009);
$time = mktime(2,0,0,03,29,2009);
echo $gmtime.'<br />'.date('r',$gmtime).'<br />'.gmdate('r',$gmtime).'<br />';
echo $time.'<br />'.date('r',$time).'<br />'.gmdate('r',$time).'<br />';
Afortunadamente he hecho un buen trabajo, pero lo dudo porque todavía estoy tratando de resolver el problema en mi cabeza.
ACTUALIZACIÓN:
contento de haber hecho esto, porque ahora estoy teniendo dudas sobre el usuario introduce las fechas.
Para obtener la fecha introducida por el usuario (teniendo en cuenta su zona horaria) para coincidir con la fecha correspondiente de UTC en la base de datos, debe ponerla en mktime()
. Y luego use gmdate('U', $timestamp);
para obtener la marca de tiempo UTC verdadera. (Creo)
Ejemplo
Mirándolo desde un lado de la presentación de informes, el usuario está utilizando la 'Europa/Londres' zona horaria. Al comienzo de nuestro script PHP llamamos al date_default_timezone_set('Europe/London');
, mientras que la Base de datos (y todos los registros dentro) todavía están en UTC.
El usuario luego envía a través del cual desea seleccionar una lista de libros añadidos a la base de datos entre el 25/03/2010 10:00 al 30/03/2010 14:00. El script PHP luego ejecuta las variables de fecha a través de mktime($hour, $minute, $second, $month, $day, $year)
para generar una marca de tiempo UTC correcta.La fecha de inicio no cambiará, pero PHP sabe que la fecha de finalización está dentro de la zona horaria BST, por lo que cambia la marca de tiempo a UTC en consecuencia.
Cuando se devuelven los resultados al usuario, date('r', $date_added)
se puede utilizar para mostrar al usuario la fecha en que se agregó el libro a la base de datos de acuerdo con su zona horaria establecida.
Este enlace puede ayudar a entender cuándo cambia. http://www.daylightsavingtime.co.uk/
@Abs - Mi post de abajo cubre cómo hacer una aplicación web en PHP zona horaria sensible, independientemente de la MVC en el que estás trabajando. Lo que hice fue tomar los principales que anoté a continuación y escribí un ayudante llamado utc_helper que me facilitó hacer cosas como obtener la hora actual con utc_now() o convertir tiempos con utc_convert ($ time, $ from_zone, $ to_zone). Si tiene alguna pregunta al respecto hágamelo saber que estaré encantado de ayudarlo. – Shane