Java GregorianCalendar changement de Fuseau horaire
Je suis en train de définir HOUR_OF_DAY champ et changement de Fuseau horaire de la GregorianCalendar objet date.
GregorianCalendar date = new GregorianCalendar(TimeZone.getTimeZone("GMT+10"));
System.out.println("HOUR: " + date.get(Calendar.HOUR_OF_DAY));
date.set(Calendar.HOUR_OF_DAY, 23);
//date.get(Calendar.HOUR_OF_DAY);
date.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println("HOUR: " + date.get(Calendar.HOUR_OF_DAY));
De sortie:
HOUR: 16
HOUR: 23
Pour une raison quelconque valeur de HOUR_OF_DAY ne change pas après le réglage de différents fuseaux horaires. Mais si je décommentez la date.obtenir pour HOUR_OF_DAY, tout fonctionne exactement comme il se doit
GregorianCalendar date = new GregorianCalendar(TimeZone.getTimeZone("GMT+10"));
System.out.println("HOUR: " + date.get(Calendar.HOUR_OF_DAY));
date.set(Calendar.HOUR_OF_DAY, 23);
date.get(Calendar.HOUR_OF_DAY); //uncommenting this line will is changing the output
date.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println("HOUR: " + date.get(Calendar.HOUR_OF_DAY));
De sortie:
HOUR: 16
HOUR: 13
Comment est-ce possible? Pourquoi .la méthode get est en train de changer le comportement d'un objet?
Vous devez vous connecter pour publier un commentaire.
La
GregorianCalendar
classe hérite de saget
méthode deCalendar
, qui a la suite d'effets secondaires:Cela signifie que le
time
valeur et tous les champs sont recalculées lorsqueget
est appelée sur unCalendar
objet. Cela peut conduire à des comportements imprévisibles, en particulier lorsqu'il est couplé avecsetTimeZone
, qui a une certaine documenté buggy comportement de sa propre.tl;dr
Éviter héritage de date-heure classes
L'héritage de date-heure les classes, y compris
GregorianCalendar
sont une source de confusion. maladroit, mal-conception de mess. Les éviter. Aujourd'hui supplanté par le java.temps classes. Plus précisément,GregorianCalendar
est remplacé parZonedDateTime
.Offset-de-UTC
Apparemment, vous avez envie d'un moment avec un offset-de-UTC de dix heures à l'avance de UTC. Définir votre décalage souhaité.
Obtenir à l'heure actuelle, comme un
OffsetDateTime
avec ce décalage.Vous souhaitez remplacer l'heure
23
.Fuseau horaire
Non, vous sont en train de changer la offset-de-UTC, pas la fuseau horaire.
Toujours préférable d'utiliser une zone plutôt que d'un simple décalage, si vous savez pour certain la zone prévue. Un fuseau horaire est une histoire du passé, du présent et de l'avenir des changements à l'offset est utilisé par les gens d'une certaine région. Avec un fuseau horaire vous pouvez toujours déterminer le décalage, mais pas vice-versa.
Spécifier un fuseau horaire nom dans le format de
continent/region
, commeAmerica/Montreal
,Africa/Casablanca
, ouPacific/Auckland
. Ne jamais utiliser de l'3-4 abréviation commeEST
ouIST
comme ils sont pas vrai fuseaux horaires, pas normalisée, et même pas unique(!).Capturer le moment actuel dans une horloge murale vu par les gens de la zone.
Remplacer l'heure de la journée.
Sur java.temps
La java.temps cadre est intégré dans Java 8 et les versions ultérieures. Ces classes permettent d'éviter la pénible vieux héritage date du temps des classes comme
java.util.Date
,Agenda
, &SimpleDateFormat
.La Joda-Time projet, maintenant dans le mode de maintenance, conseille la migration vers le java.le temps classes.
Pour en savoir plus, consultez les Oracle Tutoriel. Et de recherche de Débordement de Pile pour de nombreux exemples et des explications. La spécification est JSR 310.
À l'aide d'un Pilote JDBC compatible avec JDBC 4.2 ou plus tard, vous pouvez l'échanger java.temps objets directement avec votre base de données. Pas besoin de chaînes ni de java.sql.* classes.
Où obtenir le java.les classes de temps?
La ThreeTen-Extra projet s'étend java.temps avec d'autres classes. Ce projet est un terrain d'essai pour de possibles futurs ajouts à java.temps. Vous pouvez trouver quelques classes utiles ici comme
Intervalle
,YearWeek
,YearQuarter
, et plus.