L' Oracle Tutoriel est incorrect
Malheureusement, l' Oracle Tutoriel est incorrecte sur cette question. Cette ligne de code en exemple est tout simplement faux. Bonne prise sur votre partie.
Cette erreur est tout à fait regrettable que le Tutoriel est le contraire d'une amende de ressources pour l'apprentissage et l'étude de Java.
Instant::plus
L' Instant
de la classe n'a pas une telle méthode plusHours
défini dans Java 8 ou Java 9.
Au lieu de cela, vous pouvez appeler l' plus
méthode, et indiquer des heures.
Instant later = instant.plus( 1 , ChronoUnit.HOURS ) ;
ZonedDateTime::plusHours
L' Instant
- classe est une construction de base-bloc de la classe, indiquant un instant sur la timeline en UTC. Habituellement, lors de l'exécution de manipulations telles que l'ajout d'heures, vous aurez probablement envie de compte les anomalies telles que l'Heure d'étéet donc, vous ne se soucient de fuseau horaire. Pour cela, utilisez de l' ZonedDateTime
classe. Cette classe ne facilitent plusHours
méthode, est probablement à l'origine de la confusion pour le Tutoriel auteurs.
Spécifier un fuseau horaire nom dans le format continent/region
, comme America/Montreal
, Africa/Casablanca
ou Pacific/Auckland
. Ne jamais utiliser de l'3-4 abréviation comme EST
ou IST
qu'ils sont pas de vrais fuseaux horaires, pas normalisée, et même pas unique(!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ; // Same moment, but viewed through the lens of a region's wall-clock time.
ZonedDateTime zdtLater = zdt.plusHours( 1 ) ;
Instant
contre ZonedDateTime
Regardons un exemple d'une anomalie en ajoutant des heures. Lorsque le zonage, nous ajoutons une heure pour le moment particulier de 1 h le 23 Mars 2017 et bien sûr, s'attendre à 2 heures du matin, mais nous sommes surpris de voir 3 heures du matin. Pourtant, si l'on considère la très même moment, à l'UTC, plutôt que de ce temps particulier de la zone, le même point sur la chronologie, l'ajout d'une heure se comporte comme prévu.
Cette anomalie est due à l'adoption de l'Heure d'été (DST) dans la plupart de l'Amérique du Nord, en particulier ici, le fuseau horaire America/New_York
. Au Printemps, les horloges de "printemps" avec une heure. Comme les horloges grève de 2 heures du matin, ils sautent à 3 heures du matin. Si l'heure de deux heures n'a jamais existé à ce jour.
// ZonedDateTime
LocalDate ld = LocalDate.of( 2017 , Month.MARCH , 12 ) ;
LocalTime lt = LocalTime.of( 1 , 0 ) ;
ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
ZonedDateTime zdtOneHourLater = zdt.plusHours( 1 ) ;
System.out.println( "zdt: " + zdt ) ;
System.out.println( "zdtOneHourLater: " + zdtOneHourLater ) ;
System.out.println( "Yikes! 1 AM plus an hour is 3 AM? Yes, that is an anomaly known as Daylight Saving Time (DST)." ) ;
System.out.println( "" ) ;
// Instant
Instant instant = zdt.toInstant() ; // Adjust into UTC. Same moment, same point on the timeline, but viewed by a different wall-clock.
Instant instantOneHourLater = instant.plus( 1 , ChronoUnit.HOURS ) ;
System.out.println( "instant: " + instant ) ;
System.out.println( "instantOneHourLater: " + instantOneHourLater ) ;
System.out.println( "Instant is always in UTC. So no anomalies, no DST. Adding an hour to 1 AM results in 2 AM every time." ) ;
Voir ce code à exécuter en direct à IdeOne.com.
zdt: 2017-03-12T01:00-05:00[America/New_York]
zdtOneHourLater: 2017-03-12T03:00-04:00[America/New_York]
Oups! 1 AM plus d'une heure est 3 heures du matin? Oui, c'est une anomalie connue comme l'Heure d'été (DST).
instantané: 2017-03-12T06:00:00Z
instantOneHourLater: 2017-03-12T07:00:00Z
Instantanée est toujours en UTC. Si aucune anomalie n'a, pas l'heure d'été. L'ajout d'une heure à 1 h résultats en 2 heures à chaque fois.