¿Cuál es la mejor manera de manejar diferentes zonas horarias?

9

Estoy trabajando en una aplicación web donde habrá muchos usuarios diferentes de todo el mundo haciendo actualizaciones. Me pregunto cuál sería la mejor manera de manejar las zonas horarias. Idealmente, a medida que ocurre un evento, todos los usuarios lo ven usando su hora local.

¿Debe configurarse la hora del sistema operativo del servidor en GMT, la hora de ubicación física o la hora de mi ubicación de desarrollo?

¿Deberían configurarse la lógica de la aplicación (PHP) y la base de datos (MySQL) para almacenar datos como GMT u hora local (local para los usuarios)?

¿Existe un estándar de la industria o incluso una solución simple / obvia que simplemente no estoy viendo?

Thomas Hunter
fuente

Respuestas:

4

Guarde sus eventos en el formato TIMESTAMP de MySQL: se almacena internamente como UTC, independientemente de la zona horaria del servidor / usuario. De esta manera, los datos son portátiles independientemente de la configuración específica de su servidor. Si lo almacena en una zona horaria específica, tendrá mucho más trabajo para convertirlo en diferentes zonas horarias.

Recójalo de la base de datos en una marca de tiempo numérica (usando la función UNIX_TIMESTAMP ()) para usar con las diversas funciones de fecha / hora de PHP (como date ()).

Luego, debe establecer para cada usuario la zona horaria de PHP utilizando date_default_timezone_set () : puede obtener esa información a través de la configuración configurable por el usuario o desde los encabezados del navegador (menos preciso). Luego puede usar las funciones de fecha / hora de PHP como lo haría normalmente, y la salida estará en la zona horaria del usuario.

Otra alternativa es mostrar el tiempo relativo (por ejemplo: "hace 5 horas y 2 minutos").

Eran Galperin
fuente
55
Tenga en cuenta que (MySQL-) timestamptiene un rango limitado de 1970-01-01 00:00:01 UTCa 2038-01-19 03:14:07 UTC, que por ejemplo no permite almacenar fechas de nacimiento (al menos no para personas mayores de 40 años). De hecho, timestampes la solución menos adecuada para almacenar registros de fecha y hora. Use un datetimecampo y almacene todo como UTC.
feeela
7

Usaría la hora UTC en la base de datos y los clientes deberían convertirla a su hora local cuando sea necesario

Rachel
fuente
UTC = GMT. Estoy acostumbrado a SQL Server
Rachel
99
UTC! = GMT. UTC compensa el aumento de la duración del año causado por la ralentización de la rotación de la Tierra, mientras que GMT no. Aunque en la práctica los términos se intercambian, es bueno saber la diferencia. en.wikipedia.org/wiki/Utc
1
@DeveloperArt: No me di cuenta de eso, gracias :)
Rachel