2009-02-05 12 views
29

He estado leyendo sobre este tema durante las últimas horas, y creo que lo he manejado, pero me gustaría obtener alguna confirmación.¿La mejor manera de administrar las fechas de almacenamiento/visualización en diferentes zonas horarias en PHP?

Situación

Quiero un usuario en, digamos, California, para ser capaz de poner un comentario que serán almacenados en MySQL. Luego deseo que un usuario de, digamos, Texas, pueda ver el comentario con la fecha de publicación ajustada a su zona horaria.

Solución propuesta

Almacenamiento

  1. ejecute lo siguiente en el inicio de la aplicación, de modo que todas las funciones fechas utiliza zona UTC: date_default_timezone_set('UTC');
  2. $Date = new DateTime(); para obtener un objeto DateTime con la fecha y hora actuales en UTC.
  3. Utilice $Date->format() para obtener el valor para insertar en la columna de tipo de fecha y hora en MySQL.

Viendo

  1. Obtener información de la zona horaria del usuario desde JavaScript y lo almacena en una cookie.
  2. Ejecute una consulta MySQL SELECT para recuperar el valor de la columna de fecha y hora.
  3. $Date = new DateTime($row['time']); para instanciar un objeto DateTime con la hora UTC almacenada.
  4. $Date->setTimezone(new DateTimeZone($userTimezone)); para ajustar la hora UTC a la zona horaria del usuario.
  5. visualización utilizando $Date->format();

Es que la esencia de lo que se tiene que hacer? ¿Me estoy perdiendo una mejor solución? ¡Gracias por tu ayuda!

Respuesta

14

Se puede simplificar aún más. Como está utilizando JavaScript, ¿por qué no usar JavaScript para ajustar también la zona horaria del cliente?

  1. tienda todo momento en el servidor como UTC
  2. les prestan servicio al cliente como UTC
  3. cliente utiliza JavaScript ajustar la hora a la zona horaria local

Esto no sólo hacer las cosas más simples, pero también supera un problema con tu modelo. Si registré mi cuenta en Nueva York pero viajo a Australia, quiero ver los horarios según la zona horaria de Australia. De hecho, usar JavaScript que usa puede ajustar fácilmente la configuración, haciendo que el diseño sea aún más dinámico.En segundo lugar, puede evitar la sobrecarga de almacenar la zona horaria del usuario.

Dicho esto, si desea que su diseño se degrade a los navegadores que no son JavaScript, entonces es mejor que tome un enfoque completo del lado del servidor confiando en las cookies HTTP (en lugar de confiar en que JS obtenga las cookies).

+0

Creo que voy a configurar la cookie de zona horaria en el inicio de sesión del usuario, por lo que debería actualizarse si viaja a Australia e inicia sesión desde allí. ¿Está sugiriendo que se ejecute JavaScript en la carga de la página que busca los tiempos en, por ejemplo, y los convierte todos sobre la marcha? –

+0

La única forma de acceder al reloj del usuario es a través de JS o geo-ip. Último es complejo y poco confiable. Si va a utilizar JS en cualquier caso, hacerlo al momento de iniciar sesión requiere más mantenimiento (seguimiento del lado del servidor). Hacerlo sobre la marcha tiene más sentido aquí. – aleemb

+0

Gracias. A medida que lo investigo más, estoy empezando a estar de acuerdo contigo. –

3

Hazlo todos los derechos. Almacene todas las fechas en UTC (GMT + 0), recupérelas como tales de la base de datos y aplique el desplazamiento del usuario.

Esencialmente, lo tiene todo cubierto de principio a fin, realmente no hay nada que agregar, no creo que pueda optimizarlo más allá de lo que ya está haciendo.

+0

Estoy de acuerdo, esto es lo que haría. – Ross

Cuestiones relacionadas