JavaRush /Java-Blog /Random-DE /Java 8-Leitfaden. Teil 2.
ramhead
Level 13

Java 8-Leitfaden. Teil 2.

Veröffentlicht in der Gruppe Random-DE

Datums-API

Java 8 enthält völlig neue Datums- und Uhrzeit-APIs im java.time-Paket. Die neue Date-API ist mit der Joda-Time- Bibliothek vergleichbar , jedoch nicht dieselbe. Die folgenden Beispiele decken die wichtigsten Teile der neuen API ab.
Uhr
Mit der Uhr können Sie auf das aktuelle Datum und die aktuelle Uhrzeit zugreifen. Uhren kennen Zeitzonen und können daher anstelle von System.currentTimeMillis() verwendet werden , um die aktuelle Zeit in Millisekunden zurückzugeben. Diese Art der Zeitgenauigkeit wird auch durch die Instant- Klasse repräsentiert . Instants können zum Erstellen geerbter java.util.Date- Objekte verwendet werden . Clock clock = Clock.systemDefaultZone(); long millis = clock.millis(); Instant instant = clock.instant(); Date legacyDate = Date.from(instant); // legacy java.util.Date
Zeitzonen
Zeitzonen werden durch die abstrakte Klasse ZoneId dargestellt . Mit statistischen Fabrikmethoden kann leicht auf sie zugegriffen werden. Zeitzonen definieren Offsets, die für die Konvertierung zwischen aktuellem und lokalem Datum und Uhrzeit wichtig sind. System.out.println(ZoneId.getAvailableZoneIds()); // prints all available timezone ids ZoneId zone1 = ZoneId.of("Europe/Berlin"); ZoneId zone2 = ZoneId.of("Brazil/East"); System.out.println(zone1.getRules()); System.out.println(zone2.getRules()); // ZoneRules[currentStandardOffset=+01:00] // ZoneRules[currentStandardOffset=-03:00]
Ortszeit
LocalTime zeigt die Uhrzeit ohne Zeitzone an, zum Beispiel 17:30:15. Im folgenden Beispiel werden zwei lokale Zeitobjekte für die oben definierten Zeitzonen erstellt. Anschließend vergleichen wir die beiden Objekte und berechnen die Differenz in Stunden und Minuten zwischen ihnen. LocalTime now1 = LocalTime.now(zone1); LocalTime now2 = LocalTime.now(zone2); System.out.println(now1.isBefore(now2)); // false long hoursBetween = ChronoUnit.HOURS.between(now1, now2); long minutesBetween = ChronoUnit.MINUTES.between(now1, now2); System.out.println(hoursBetween); // -3 System.out.println(minutesBetween); // -239 LocalTime verfügt über verschiedene Factory-Methoden, um die Instanziierung zu vereinfachen, einschließlich String-Parsing. LocalTime late = LocalTime.of(23, 59, 59); System.out.println(late); // 23:59:59 DateTimeFormatter germanFormatter = DateTimeFormatter .ofLocalizedTime(FormatStyle.SHORT) .withLocale(Locale.GERMAN); LocalTime leetTime = LocalTime.parse("13:37", germanFormatter); System.out.println(leetTime); // 13:37
Lokales Datum
LocalDate zeigt ein bestimmtes Datum an, zum Beispiel den 11.03.2014. Instanzen sind unveränderlich und funktionieren ähnlich wie LocalTime. Das Beispiel zeigt, wie man ein neues Datum berechnet, indem man Tage, Monate oder Jahre addiert oder subtrahiert. Beachten Sie, dass jede Operation an einem Objekt ein neues Objekt zurückgibt. LocalDate today = LocalDate.now(); LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS); LocalDate yesterday = tomorrow.minusDays(2); LocalDate independenceDay = LocalDate.of(2014, Month.JULY, 4); DayOfWeek dayOfWeek = independenceDay.getDayOfWeek(); System.out.println(dayOfWeek); // FRIDAY Das Parsen von LocalDate aus einer Zeichenfolge ist genauso einfach wie das Parsen von LocalTime: DateTimeFormatter germanFormatter = DateTimeFormatter .ofLocalizedDate(FormatStyle.MEDIUM) .withLocale(Locale.GERMAN); LocalDate xmas = LocalDate.parse("24.12.2014", germanFormatter); System.out.println(xmas); // 2014-12-24
LocalDateTime
LocalDateTime zeigt die Datumszeit an. Dies ist eine Kombination aus dem oben angegebenen Datum und der Uhrzeit in einer Kopie. LocalDateTime-Instanzen sind unveränderlich und funktionieren ähnlich wie LocalTime und LocalDate. Wir können Methoden verwenden, um die von uns benötigten Instanzeigenschaftswerte abzurufen: LocalDateTime sylvester = LocalDateTime.of(2014, Month.DECEMBER, 31, 23, 59, 59); DayOfWeek dayOfWeek = sylvester.getDayOfWeek(); System.out.println(dayOfWeek); // WEDNESDAY Month month = sylvester.getMonth(); System.out.println(month); // DECEMBER long minuteOfDay = sylvester.getLong(ChronoField.MINUTE_OF_DAY); System.out.println(minuteOfDay); // 1439 Zusammen mit zusätzlichen Zeitzoneninformationen kann die Instanz in Instant konvertiert werden. Instants können einfach in die alten Typen konvertiert werden, die von java.util.Date erben. Instant instant = sylvester .atZone(ZoneId.systemDefault()) .toInstant(); Date legacyDate = Date.from(instant); System.out.println(legacyDate); // Wed Dec 31 23:59:59 CET 2014 Das Formatieren eines Datums und einer Uhrzeit funktioniert auf die gleiche Weise wie das Formatieren eines Datums oder einer Uhrzeit. Anstatt vordefinierte Datumsformate zu verwenden, können wir manuell definierte Formate verwenden. DateTimeFormatter formatter = DateTimeFormatter .ofPattern("MMM dd, yyyy - HH:mm"); LocalDateTime parsed = LocalDateTime.parse("Nov 03, 2014 - 07:13", formatter); String string = formatter.format(parsed); System.out.println(string); // Nov 03, 2014 - 07:13 Im Gegensatz zu java.text.NumberFormat ist das neue DateTimeFormatter unveränderlich und Thread-sicher. Weitere Informationen zur Syntax zum Schreiben von Formaten finden Sie hier .

Anmerkungen

Anmerkungen in Java 8 sind wiederholbar. Schauen wir uns ein Beispiel an, um zu veranschaulichen, wie das funktioniert. Zunächst definieren wir einen Annotations-Wrapper, der ein Array gültiger Annotationen speichert: @interface Hints { Hint[] value(); } @Repeatable(Hints.class) @interface Hint { String value(); } Java 8 ermöglicht uns die Verwendung mehrerer Annotationen desselben Typs, indem wir die Annotation @Repeatable deklarieren. Option 1: Verwendung der Container-Annotation (alte Schule) (Java 8 ermöglicht uns die Verwendung mehrerer Annotationen desselben Typs durch die Deklaration einer @Repeatable- Annotation .) Option 1: Verwendung des Annotations-Containers (alte Schule) @Hints({@Hint("hint1"), @Hint("hint2")}) class Person {} Option 2: Verwendung wiederholbarer Annotationen ( neues Feature) @Hint("hint1") @Hint("hint2") class Person {} Mit Option zwei legt der Java-Compiler implizit die @Hint-Annotation fest. Dies ist wichtig für das Lesen von Anmerkungsinformationen durch Reflexion. Obwohl wir die @Hints- Annotation nicht für die Person- Hint hint = Person.class.getAnnotation(Hint.class); System.out.println(hint); // null Hints hints1 = Person.class.getAnnotation(Hints.class); System.out.println(hints1.value().length); // 2 Hint[] hints2 = Person.class.getAnnotationsByType(Hint.class); System.out.println(hints2.length); // 2 Klasse deklariert haben , kann sie mit der Methode getAnnotation(Hints.class) gelesen werden . Eine praktischere Methode ist jedoch getAnnotationsByType , die mithilfe der Annotation @Hint Zugriff auf alle Annotationen bietet . Darüber hinaus erweitert sich die Verwendung von Annotationen in Java 8 auf zwei Zwecke: @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) @interface MyAnnotation {}

Das ist alles

Mein Java 8-Programmier-Tutorial ist abgeschlossen. Wenn Sie mehr über alle neuen Klassen und API-Funktionen in JDK 8 erfahren möchten, lesen Sie einfach meinen nächsten Artikel. Dies wird Ihnen helfen, alle neuen Klassen und versteckten Funktionen in JDK 8 zu verstehen, wie z. B. Arrays.parallelSort , StampedLock und CompletableFuture .
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION