2009-11-06 24 views
29

Estoy trabajando en una aplicación GWT donde tengo que apoyar el siguiente escenario:
El servidor se encuentra en la zona horaria Una
El navegador del cliente se establece en tiempo de la zona B
la aplicación GWT está configurado para mostrar la fecha/hora en la zona horaria Ccliente en GWT

Desde GWT no es compatible con el calendario y el soporte nativo para el tiempo zonas en JavaScript es inexistente no puedo pensar en una solución agradable y limpio a este problema

¿Alguno de ustedes ha hecho algo similar o sabe de algún buen que yo podría utilizar?

Gracias!

+0

¿Cómo se maneja usando una zona horaria diferente a la que utiliza GWT? – Fedearne

Respuesta

25

En mi experiencia, la siguiente mejor práctica reduce significativamente la complejidad y la confusión de la CustomFieldSerializer cuando se trata de fechas y zonas horarias en GWT:

  1. Siempre que se 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.
  2. Cuando se muestre la fecha al usuario final, formatee la fecha utilizando 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 la zona horaria C, según corresponda.

+0

Me perdí la sección sobre el manejo de zonas horarias en el documento de DateTimeFormat java. ¡Parece que proporciona exactamente el tipo de funcionalidad que necesito! Lo usaré en combinación con el enfoque que propongas. ¡Gracias! –

2

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í:

  • calcular la fecha deseada en el servidor (no hay límites Java en lo que puede hacer allí) y enviarlo en una cadena que se mostrará al cliente, por lo que no tiene que hacer más transformaciones en el cliente.

o:

  • calculará el desfase entre la zona horaria A y C en el servidor, que se aplican a todos los objetos de fecha que está pasando con el cliente y simplemente mostrarlos en el cliente.

si por alguna razón ninguno de ellos eran válidas para usted

  • calculará el desfase, lo envía al cliente y aplicarlo a cualquier fecha en que recibe desde el servidor mediante la transformación de MS, añadiendo el compensar y luego crear un objeto Date nuevamente.
6

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:

  1. a gestionar la conversión de zona horaria a sí mismo.

  2. Usted anula el serializador/deserializador de java.util.Date como in this post. Y tal vez utilizando una implementación personalizada java.util.Date, que anula el getTimezoneOffset(). ¡Este enfoque requiere la recompilación de la API de GWT !.

  3. 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.

Yo preferiría la opción 3.Al menos hasta que GWT RPC tal vez algún día va a apoyar para anular


Usefull date/time formatting hints.

+0

un objeto java.util.Date no tiene noción de timzone. – EisenRatte

3

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 la 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 un Largo.

UTCDateTimeUtils - El código de servidor que se divide una fecha en 2 valores de largo y adecuado para UTCDateBox y UTCTimeBox en una zona horaria determinada y los combina de nuevo en una fecha en una zona horaria determinada.

Here is an example of the date the time controls being used together.

Blog article describing their implementation.

These widgets are available on GitHub.

+0

bummer, todos los enlaces rotos ahora que googlecode está caído. –

+0

Actualicé los enlaces para señalar el proyecto que ahora se encuentra en GitHub. – andykellr

Cuestiones relacionadas