¿Cuál es la mejor manera de detectar y almacenar la zona horaria en la que se encuentra el cliente de una aplicación web?

StackOverflow https://stackoverflow.com/questions/179834

  •  05-07-2019
  •  | 
  •  

Pregunta

Tengo una aplicación web de zona horaria múltiple que almacena todos los valores de fecha y hora en UTC en la base de datos, cuando las acciones ocurren en el servidor, puedo convertir fácilmente la hora en UTC.

Sin embargo, cuando un cliente ingresa un tiempo o un período de tiempo, ¿cuál es la mejor manera de detectarlo y almacenarlo?

Actualmente estoy haciendo lo siguiente:

  1. Obtenga el valor de Date.getTimezoneOffset () (javascript)
  2. Publica eso en el código del lado del servidor a través de ICallbackEventHandler en la página.
  3. Almacenar ese valor en la sesión
  4. En cualquier solicitud posterior, calcule el valor de fecha / hora de salida / entrada utilizando la zona horaria del cliente.

Independientemente de la implementación real, esto parece ser una solución no elegante. ¿Alguien tiene un método mejor?

¿Fue útil?

Solución

Estaba haciendo algo muy similar, pero ahora creo que prefiero usar javascript para convertir todo el tiempo a local en el lado del cliente. El servidor dará todos los tiempos en UTC en la página generada, y el javascript lo convertirá una vez que se cargue la página.

Esto elimina la confusión en el código del lado del servidor, ya que siempre sé qué hora es (UTC). En el lado del cliente, estoy usando jquery y la función each () para formatear todos los valores de tiempo a la vez. Escribo cada una de las veces como una hora de Unix en un campo oculto para que esto sea fácil de procesar con jQuery.

El único problema que veo con este método es que a) Todavía no tengo una buena rutina de formateo de fecha / hora en javascript, yb) si el usuario tiene javascript desactivado, entonces no funciona.

Otros consejos

Podría usar el " encabezado " propiedad del objeto HttpRequest para consultar el " If-Modified-Since " Encabezado enviado por el cliente. Este encabezado debe contener una fecha en un formato que incluya la zona horaria del cliente, como este:

If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT

una simple extracción de subcadenas te dará el código de zona horaria. Sin embargo, me temo que no todos los navegadores son coherentes al enviar ese encabezado, por lo que debería experimentar un poco al respecto.

saludos, Fabrizio

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top