Das Oracle-Tutorial ist falsch
Leider ist das Oracle-Tutorial in dieser Angelegenheit falsch. Diese Zeile des Beispielcodes ist einfach falsch. Guter Fang von Ihrer Seite.
Dieser Fehler ist ziemlich unglücklich, da das Tutorial ansonsten eine gute Ressource zum Lernen und Lernen von Java ist.
Instant::plus
Die Instant
Klasse verfügt weder plusHours
über eine in Java 8 noch in Java 9 definierte Methode .
Stattdessen können Sie die plus
Methode aufrufen und Stunden angeben.
Instant later = instant.plus( 1 , ChronoUnit.HOURS ) ;
ZonedDateTime::plusHours
Die Instant
Klasse ist eine grundlegende Bausteinklasse, die einen Moment auf der Zeitachse in UTC angibt . Wenn Sie Manipulationen wie das Hinzufügen von Stunden ausführen, möchten Sie normalerweise Anomalien wie die Sommerzeit berücksichtigen , sodass Sie sich um die Zeitzone kümmern . Verwenden Sie dazu die ZonedDateTime
Klasse. Diese Klasse ist bieten eine bequemeplusHours
Verfahren, eine wahrscheinliche Quelle der Verwirrung für die Tutorial Autoren.
Geben Sie einen richtigen Zeitzonennamen im Format continent/region
, wie zum Beispiel America/Montreal
, Africa/Casablanca
oder Pacific/Auckland
. Verwenden Sie niemals die Abkürzung für 3-4 Buchstaben, wie z. B. EST
oder, IST
da es sich nicht um echte Zeitzonen handelt, die nicht standardisiert und nicht einmal eindeutig (!) Sind.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
ZonedDateTime zdtLater = zdt.plusHours( 1 ) ;
Instant
gegen ZonedDateTime
Schauen wir uns ein Beispiel für eine Anomalie beim Hinzufügen von Stunden an. In Zonen fügen wir dem jeweiligen Moment von 1 Uhr morgens am 23. März 2017 eine Stunde hinzu und erwarten natürlich 2 Uhr morgens, aber wir sind überrascht, 3 Uhr morgens zu sehen. Wenn wir jedoch denselben Moment in UTC und nicht diese bestimmte Zeitzone betrachten, verhält sich derselbe Punkt auf der Zeitachse, an dem eine Stunde hinzugefügt wird, wie erwartet.
Diese besondere Anomalie ist auf die Einführung der Sommerzeit (DST) in den meisten Teilen Nordamerikas zurückzuführen, insbesondere in der Zeitzone America/New_York
. Im Frühling "springen" die Uhren eine Stunde vorwärts. Wenn die Uhren 2 Uhr morgens schlagen, springen sie auf 3 Uhr morgens. Die Zwei-Uhr-Stunde gab es an diesem Tag also nie.
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 = zdt.toInstant() ;
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." ) ;
Sehen Sie diesen Code live auf IdeOne.com .
zdt: 2017-03-12T01: 00-05: 00 [America / New_York]
zdtOneHourLater: 2017-03-12T03: 00-04: 00 [America / New_York]
Huch! 1 Uhr plus eine Stunde ist 3 Uhr? Ja, das ist eine Anomalie, die als Sommerzeit (DST) bezeichnet wird.
Augenblick: 2017-03-12T06: 00: 00Z
instantOneHourLater: 2017-03-12T07: 00: 00Z
Instant ist immer in UTC. Also keine Anomalien, keine Sommerzeit. Das Hinzufügen einer Stunde zu 1 Uhr morgens führt jedes Mal zu 2 Uhr morgens.