2012-04-06 1 views
1

Comment puis-je déplacer le fuseau horaire de l'objet Date créé dans le fuseau horaire local vers le fuseau horaire cible?Comment puis-je déplacer le fuseau horaire de l'objet Date créé dans le fuseau horaire local vers le fuseau horaire cible dans le client GWT?

Voici ce dont j'ai besoin. Je souhaite que le client Web sélectionne une date en utilisant DatePicker mais l'objet Date résultant doit ressembler à comme s'il avait été sélectionné dans un autre fuseau horaire. Comme il n'y a aucun moyen de dire DatePicker pour ce faire, je dois déplacer manuellement la date.

Par exemple c'est le 6 avril 2012 2h42 en Californie en ce moment. Date de création sera en fuseau horaire UTC-7. Je veux avoir l'objet Date du 6 avril 2012 02:42 dans le fuseau horaire Europe/Moscou.

est que je fais ici dès maintenant:

final TimeZoneConstants constTz = GWT.create(TimeZoneConstants.class); 
final TimeZone timeZoneMsk = TimeZone.createTimeZone(constTz.europeMoscow()); 
final TimeZone timeZoneCali = TimeZone.createTimeZone(constTz.americaLosAngeles()); 

Date curTime = new Date(); 

DateTimeFormat dateTimeFormat = DateTimeFormat.getFullDateTimeFormat(); 
Date mskTime = new Date(curTime.getTime() - (curTime.getTimezoneOffset() - timeZoneMsk.getStandardOffset()) * 60 * 1000); 

String strLocal = dateTimeFormat.format(curTime, timeZoneCali); // Friday, 2012 April 06 02:42:59 Pacific Daylight Time 
String strMsk = dateTimeFormat.format(mskTime, timeZoneMsk); // Friday, 2012 April 06 02:42:59 Moscow Standard Time 

Il y a deux problèmes avec cette méthode:

  • Si vous me demandez il semble assez bizarre.
  • Le fuseau horaire dans mskTime est toujours -0007. Je me demande si cela peut causer des problèmes à l'avenir lorsque je désérialiser cet objet du magasin de données Google App Engine.

ou devrais-je produire chaîne avec date complète de temps californienne locale, remplacer fuseau horaire dans la chaîne, puis générer de nouvelles Date en appelant DateTimeFormat.parse()? Il semble assez hacky aussi ...

Qu'es-tu de JodaTime for GWT? Est-ce assez stable pour la production?

Répondre

1

Votre code semble à peu près correct. L'utilisation de DateTimeFormat.parse pourrait rendre l'intention plus claire pour un lecteur occasionnel. Ce n'est pas très souvent que vous êtes donné timezones A et B et un objet Date, et vous devez produire un nouvel objet Date qui, au moment du formatage en B, a en même temps que l'original au moment du formatage en A.

Le fuseau horaire dans mskTime est toujours -0007. Je me demande si cela peut causer des problèmes à l'avenir lorsque je désérialiser cet objet du magasin de données Google App Engine.

Non, il ne peut y avoir aucun problème. Rappelez-vous qu'un objet Date représente un point universel dans le temps non lié à un fuseau horaire. Quand c'est le 6 avril 14h40 à Moscou, c'est le 6 avril 03:40 en Californie, donc les objets Date sont égaux.

Questions connexes