2009-11-26 2 views
1

OK - Je me sens assez bête pour poser une question aussi simple, mais bon. J'essaie d'obtenir l'heure actuelle dans un fuseau horaire différent dans une application web Java. J'ai essayé la solution évidente suivante: dans mon servlet,Comment obtenir l'heure actuelle dans un fuseau horaire différent en Java?

Calendar localCalendar = Calendar.getInstance(myBean.getTimeZone());

alors je passe l'objet de calendrier par un JSP comme attribut de requête « localCalendar »:

It is now: [${requestScope.localCalendar.time}] 
in TimeZone ${requestScope.localCalendar.timeZone.ID} 

mais ma sortie semble ignorer l'ensemble de fuseau horaire, soit

It is now: [Thu Nov 26 10:01:03 GMT 2009] in TimeZone Indian/Mahe

Je devine que c'est quelque chose à voir avec Loc est-il possible d'obtenir simplement l'heure formatée pour mes paramètres régionaux, dans un autre fuseau horaire?

Répondre

6

Les données internes de Calendar est essentiellement:

Un instant dans le temps peut être représenté par une valeur milliseconde est un décalage de l'époque, 1er janvier 1970 00: 00: 00.000 GMT (grégorien).

, il détient donc une long qui sera le même, peu importe ce que les opérations que vous utilisez sur et toString ne fait aucune promesse.

Vous souhaitez formater la date en fonction des paramètres régionaux et du fuseau horaire. Vous pouvez le faire dans la couche de présentation (le JSP) en utilisant des choses comme JSTL ou vous pouvez formater la date dans votre bean en utilisant un DateFormat et renvoyer la valeur sous forme de chaîne.

+0

Parfait - les balises de mise en forme JSTL incluent un formatDate qui prend un attribut de fuseau horaire. Je ne pensais pas au fuseau horaire comme formatage ... mais bon, ça marche. Merci! – Brabster

3

Si vous souhaitez afficher la date dans un format donné/fuseau horaire, utilisez SimpleDateFormat

0

Le answer by McDowell est correct, mais les classes java.util.Calendar (et) sont obsolètes.

java.time

Le cadre de java.time est construit en Java 8 et plus tard, et à l'arrière-Ported à Java 6 & 7 et Android. Ces nouvelles classes supplantent les anciennes classes date-heure car elles se sont avérées mal conçues, déroutantes et gênantes. Un Instant est le moment actuel en UTC.

Instant now = Instant.now(); 

Appliquer un fuseau horaire ZoneId pour obtenir un ZonedDateTime.

ZoneId zoneId = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant , zoneId); 

Time Zone vs Locale

Notez que time zone et Locale sont des questions orthogonales. Le fuseau horaire affecte le wall clock time, le offset from UTC. Locale affecte uniquement la présentation. Locale est utilisé pour (a) un langage humain pour le nom du jour et du mois, et (b) les normes culturelles concernant des questions telles que le mois avant le jour du mois, la virgule par rapport à la période, et ainsi de suite.Par exemple, vous pouvez avoir un utilisateur qui lit en français Québécois en accédant à votre page tout en travaillant dans India. Utilisez donc un fuseau horaire de Asia/Kolkata avec un Locale.CANADA_FRENCH.

Pour générer une chaîne formatée, utilisez la classe DateTimeFormatter. De nombreux exemples existent déjà dans Stack Overflow. Spécifiez la méthode souhaitée/attendue Locale via withLocale.

Questions connexes