2010-01-20 7 views
8

GWT ne sérialise pas la date Java correctement. Quand j'ai essayé d'envoyer Date créée en Javascript à travers le fil, j'ai découvert que les dates entre le 1er avril (drôle) et le 25 octobre pour les années avant l'année 1983 sont soustraites d'un jour.GWT java.util.Date Bogue de sérialisation

Cela signifie que, disons, les deux 1982-04-01 et 1982-03-31 deviennent 1982-03-31 du côté Java. Étant donné les dates en question, je suppose que c'est une sorte de problème d'heure d'été. J'ai essayé googling, et trouvé seulement one other reference qui décrit le même problème.

J'ai également essayé de soumettre un bug à l'équipe de GWT, mais curieusement, je n'ai pas trouvé de bugtracker pour GWT.

Alors, mes questions sont les suivantes:

  1. Toute autre course dans tout cela? Je suis sur GWT 1.7, et je voudrais confirmer si cela se produit sur 2.0 aussi.

  2. Ma solution de contournement consistait à envoyer des dates en tant que chaînes et à les analyser sur le serveur. Quelqu'un sait mieux la solution de contournement?

+1

Nous avons rencontré d'autres problèmes liés à la date (je ne sais plus ce qu'ils étaient), donc nous sommes passés à Strings. – Drejc

Répondre

5

En supposant que vous utilisez un java.util.Date

Question 1: Il semble qu'il est fixé à 2.0. J'ai créé les deux dates ci-dessus (1982-04-01 et 1982-03-31) et elles arrivent correctement au serveur (les deux représentent respectivement sur le serveur 1982-04-01 et 1982-03-31). Ma configuration est:

  • GWT 2.0
  • Java 1.6
  • OSX 10.6.2

Question 2: Vous pouvez toujours passer les « millisecondes depuis le 1er Janvier 1970, 00:00:00 GMT 'sur le service async - que vous pouvez obtenir en utilisant getTime() sur l'objet date. Côté serveur, vous pouvez instancier une nouvelle date en transmettant cette valeur au constructeur:
Date date = new Date(millis);
Cela évite de manipuler les formateurs et les analyseurs.

+1

En fait, GWT est déjà en série en utilisant des millisecondes, mais il laisse tomber le fuseau horaire. Donc un "3. Avril 2001 00:00 GMT" dans le navigateur peut devenir "2. Avril 2001 23:00 CET" sur le serveur. Et si vous regardez seulement la date, il semble que ce soit un jour de congé, même si le temps réel signifie la même chose. – Stroboskop

0

Nous avons également rencontré un problème similaire. Il y a assez longtemps que je ne me souviens pas des détails exacts, mais l'essentiel était qu'il y avait quelques différences mineures entre java.util.Date et la façon dont les dates étaient traitées en Javascript. Notre solution de contournement était effectivement la même que la vôtre, où la valeur réelle envoyée sur le fil était généralement une chaîne.

1

Si vous n'avez pas besoin d'effectuer des conversions côté client (adapter au fuseau horaire de l'utilisateur) ou des calculs, envoyez-le dans une chaîne à partir du serveur.

Vous n'avez jamais rencontré votre problème spécifique.

2

Les dates et les heures sont un sujet compliqué. La conversion peut dépendre de l'environnement local dans lequel le navigateur s'exécute et de la mise à jour de la JVM sur le serveur et des paramètres régionaux des clients.

Dans certains cas, il peut y avoir des différences car dans certaines régions, ils ont changé de fuseau horaire dans le passé. GWT envoie des dates en utilisant seulement des millis depuis le temps de l'époque.Comme il utilise des objets Date, vous êtes limité dans le fait que les dates du côté serveur seront automatiquement modifiées dans le fuseau horaire des serveurs. Êtes-vous sûr de prendre en compte la différence possible dans les fuseaux horaires entre le client et le serveur?

David

+0

Dans mon cas, le serveur et le client fonctionnaient tous les deux sur la même machine, c'est donc définitivement un problème de sérialisation GWT. – Domchi

+0

Ils peuvent être dans le même fuseau horaire maintenant. Mais en regardant les dates, je pense que vous venez de découvrir l'heure d'été. Et l'une des machines/services n'en tient pas compte lors de la sérialisation de l'heure. Et indépendamment de cela - je ne pense pas que vous voulez faire un webservice qui dépend du fuseau horaire du navigateur étant le même que celui du serveur. – Stroboskop

1

Les problèmes possibles soure est la différence dans des fuseaux horaires client/serveur.

+0

Voir ma réponse à David, le client et le serveur sont dans le même fuseau horaire. Je crois que le problème est que Javascript et Java traitent les dates différemment, donc envoyer des millisecondes n'est pas assez bon. – Domchi