28 votes

Prise en charge des fuseaux horaires côté client dans GWT

Je suis en train de travailler sur une application GWT où j'ai besoin pour appuyer le scénario suivant:
Le serveur est situé dans le fuseau horaire d'Un
Le navigateur du client est défini à la fois en zone B
L'application GWT est configuré pour l'affichage de la date/de l'heure dans le fuseau horaire C

Depuis GWT ne prend pas en charge le Calendrier et la prise en charge native de temps les zones en javascript est inexistante, je ne peux pas penser à une belle et propre la solution à ce problème.

N'avez-vous fait quelque chose de similaire ou connaissez-vous un bon utils je pourrais utiliser?

Merci!

24voto

Dave Paroulek Points 6033

Dans mon expérience, la meilleure pratique est sensiblement réduit la complexité et de la confusion lorsque vous traitez avec des dates et les fuseaux horaires dans gwt:

  1. Chaque fois que l'exploitation/l'enregistrement des dates dans la demande, traiter toutes les dates comme le nombre de millisecondes depuis l'époque GMT fuseau horaire. Vous pouvez les stocker sous forme de chaîne ou de type int, il n'a pas vraiment faire une différence.
  2. Chaque fois que l'affichage de la date à l'utilisateur final, le format de la date en utilisant le fuseau horaire approprié.

Pour votre cas, lorsque vous créez une date sur le Serveur (fuseau horaire A) convertir en millisecondes écoulées depuis l'époque GMT avant de l'envoyer au Client. Sur le client, l'utilisation DateTimeFormat (ou d'écrire que vous êtes propre date de formateur util) pour la convertir en soit le fuseau horaire B ou le fuseau horaire C selon le cas.

6voto

Fedearne Points 1731

Vous chat de modifier le GWT fuseau horaire, par conséquent tous les java.util.Date de a le navigateur le fuseau horaire. Vous aurez besoin pour gérer le courant le fuseau horaire manuellement.

Je vois 3 options:

  1. Vous gérez le fuseau horaire de conversion vous-même.

  2. Vous remplacez le sérialiseur/deserializer de java.util.Date comme dans ce post. Et peut-être en utilisant une mesure de java.util.Date de l' implémentation, qui remplace la getTimezoneOffset(). Cette approche nécessite la recompilation de l'API GWT!.

  3. Vous mettez en œuvre votre propre Date, soit par l'extension de java.util.Date (comme dans l'option 2) ou en l'enveloppant avec certains fuseau horaire de l'objet. Dans cette option CustomFieldSerializer est peut-être encore utile, mais il n'est pas nécessaire de recompiler l'API GWT.

Je préfère l'option 3. Au moins jusqu'à ce que GWT RPC peut-être un jour aura le soutien de surcharger l'CustomFieldSerializer de l'


Utile de date/heure de mise en forme des conseils.

3voto

pulazzo Points 572

Dave Paroulek réponse est la bonne approche. Si vous voulez voir un exemple de cela, nous avons créé des widgets de travail indépendant de Fuseau horaire et de traiter les valeurs sur le serveur-côté où nous avons toutes les informations dont nous avons besoin.

UTCDateBox - Wrapper autour de l'GWT DateBox et choisit toujours la date à minuit GMT et représente la valeur comme un Long au lieu d'une Date.

UTCTimeBox - Nouveau widget qui choisit toujours un temps que millis depuis minuit, indépendant de fuseau horaire, également représenté comme un Long.

UTCDateTimeUtils - code côté Serveur qui divise la Date en 2 Longs valeurs appropriées pour UTCDateBox et UTCTimeBox dans un Fuseau horaire et les combine en arrière dans une Date dans un Fuseau horaire.

Voici un exemple de la date de contrôles utilisés ensemble.

Article de Blog décrivant leur mise en œuvre.

Ces widgets sont disponibles sur Google Code.

2voto

Iker Jimenez Points 3351

Je suis en supposant que vous utilisez des appels RPC pour la communication serveur-client ici. Aussi en supposant que vous n'avez pas de soins sur le fuseau horaire B, et vous savez quel fuseau horaire C est sur le serveur.

Vous avez quelques options ici:

  • Calculer la date souhaitée du serveur (pas de Java limites sur ce que vous pouvez faire là-bas) et de l'envoyer dans une Chaîne de caractères à afficher pour le client, de sorte que vous n'avez pas à faire de plus, des transformations sur le client.

ou:

  • Calculer le décalage entre le fuseau horaire A et C sur le serveur, de les appliquer à tous les objets Date vous êtes de passage pour le client et juste de les afficher sur le client.

si pour une raison quelconque, aucune de ces sont valables pour vous

  • Calculer le décalage, l'envoi au client et de l'appliquer à la Date que vous recevez à partir du serveur par la transformation de ms, en ajoutant le décalage et ensuite, la création d'un objet Date, de nouveau.

1voto

Ramesh Ganesan Points 11

voir ce projet de démonstration GWT timezone demo project

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X