74 votes

La classe Java 8 Instant n'a pas de méthode plusHours malgré le code d'exemple Oracle Tutorial

L' Oracle Tutoriel page pour l' Instant classe montre cet exemple de code:

Instant oneHourLater = Instant.now().plusHours(1);

Lorsque j'essaie de compiler ce code, le compilateur génère l'erreur:

  • Erreur
InstantPrint.java:6: erreur: impossible de trouver le symbole
 Instant oneHourLater = Instantanée.maintenant().plusHours(1);
^
 symbole: la méthode plusHours(int)
 emplacement: Instantanée classe

Mais ce Java documentation mentionne plusHours() méthode, mais je vérifier cette Instant de la classe et il ne contient pas d' plusHours() méthode.

Par la suite, pourquoi mentionner cette plusHours() méthode dans l'exemple?

58voto

Basil Bourque Points 8938

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/Casablancaou 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X