mexico - obtener zona horaria java
Soporte de zona horaria del cliente en GWT (6)
Estoy trabajando en una aplicación GWT donde necesito apoyar el siguiente escenario:
El servidor está ubicado en la zona horaria A
El navegador del cliente está configurado en la zona horaria B
La aplicación GWT está configurada para mostrar la fecha / hora en la zona horaria C
Como GWT no es compatible con Calendar y la compatibilidad nativa para las zonas horarias en javascript es inexistente, no puedo pensar en una solución agradable y limpia para este problema.
¿Alguno de ustedes ha hecho algo similar o sabe de algún buen uso que pueda usar?
¡Gracias!
En mi experiencia, las siguientes mejores prácticas reducen significativamente la complejidad y la confusión cuando se trata de fechas y zonas horarias en gwt:
- Siempre que opere / almacene fechas dentro de la aplicación, trate todas las fechas como milisegundos desde la época en la zona horaria GMT. Puede almacenarlos como cadena o int, realmente no hace la diferencia.
- Siempre que muestre la fecha al usuario final, formatee la fecha usando la zona horaria correspondiente.
Para su caso, cuando crea una fecha en el Servidor (zona horaria A), conviértala a milisegundos desde época en GMT antes de enviarla al Cliente. En el cliente, use DateTimeFormat (o escriba su propia herramienta de formateo de fecha) para convertirla en la zona horaria B o en la zona horaria C, según corresponda.
La respuesta de Dave Paroulek es el enfoque correcto. Si desea ver un ejemplo de esto, creamos widgets que funcionan independientemente de TimeZone y procesamos los valores en el lado del servidor donde tenemos toda la información de TimeZone que necesitamos.
UTCDateBox - Contenedor alrededor del DateBox GWT y siempre elige la fecha a medianoche en GMT y representa el valor como Long en lugar de Date.
UTCTimeBox - Nuevo widget que siempre elige un tiempo como milis desde la medianoche, independientemente de la zona horaria, también representado como Largo.
UTCDateTimeUtils - Código del lado del servidor que divide una Fecha en 2 valores Long apropiados para UTCDateBox y UTCTimeBox en un TimeZone dado y los combina de nuevo en una Fecha en un TimeZone dado.
Aquí hay un ejemplo de la fecha en que se usan los controles de tiempo juntos.
No puede cambiar la zona horaria GWT, por lo tanto, todos los java.util.Date tienen la zona horaria del navegador. Necesitará manejar la configuración actual de la zona horaria manualmente.
Veo 3 opciones:
Usted administra la conversión de zona horaria usted mismo.
Sobreescribes el serializador / deserializador de java.util.Date como en esta publicación . Y tal vez utilizando una implementación personalizada java.util.Date , que anula getTimezoneOffset() . ¡Este enfoque requiere la recompilación de la API de GWT !.
Implementa su propia fecha extendiendo java.util.Date (como en la opción 2) o envolviéndola con algún objeto de zona horaria. En esta opción, CustomFieldSerializer''s aún puede ser útil, pero no es necesario volver a compilar la API de GWT.
Preferiría la opción 3. Al menos hasta que GWT RPC pueda algún día admitir que se anule el CustomFieldSerializer
Supongo que está utilizando llamadas RPC para la comunicación servidor-cliente aquí. También suponiendo que no te importa la zona horaria B, y sabes qué zona horaria C está en el servidor.
Usted tiene algunas opciones aquí:
- Calcule la fecha deseada en el servidor (no hay límites de Java sobre lo que puede hacer allí) y envíela en String para que se muestre al cliente, para que no tenga que hacer más transformaciones en el cliente.
o:
- Calcule el desplazamiento entre la zona horaria A y C en el servidor, aplíquelo a todos los objetos Date que está pasando al cliente y simplemente visualícelos en el cliente.
si por alguna razón ninguno de estos fuera válido para usted
- Calcule el desplazamiento, envíelo al cliente y aplíquelo a cualquier Fecha que reciba del servidor mediante la transformación a ms, agregue el desplazamiento y luego vuelva a crear un objeto Fecha.
ver este proyecto de demostración GWT timezone demo project
Creé una versión de Java compatible con GWT de la biblioteca jsTimezoneDetect Javascript específicamente para este propósito. Esto debería proporcionar una (muy buena conjetura) del nombre de la zona horaria puramente en el lado del cliente. No dude en probarlo y avíseme si funciona o no para usted.