JavaRush /Java-Blog /Random-DE /Eine intuitive, robuste Bibliothek zum Arbeiten mit Zeite...
theGrass
Level 24
Саратов

Eine intuitive, robuste Bibliothek zum Arbeiten mit Zeiten und Daten ist endlich in Java verfügbar (Teil 2).

Veröffentlicht in der Gruppe Random-DE
Tageszeiten
    Also lasst uns weitermachen. Die nächste Entität nach dem Datum ist die Tageszeit, dargestellt durch die LocalTime- Klasse . Ein klassisches Beispiel ist die Darstellung der Öffnungszeiten eines Ladens, beispielsweise von 7:00 bis 23:00 Uhr. Geschäfte sind zu dieser Zeit im ganzen Land geöffnet, die tatsächlichen Zeiten variieren jedoch je nach Zeitzone.     LocalTime ist eine Wertklasse, die nur die Zeit ohne zugehöriges Datum oder Zeitzone speichert. Beim Addieren oder Subtrahieren eines Zeitraums wird dieser um Mitternacht abgeschnitten. Das heißt, 20:00 plus 6 Stunden ergibt 2:00. Die Verwendung von LocalTime ähnelt LocalDate : Modifikatoren können mit LocalTimeLocalTime time = LocalTime.of(20, 30); int hour = date.getHour(); // 20 int minute = date.getMinute(); // 30 time = time.withSecond(6); // 20:30:06 time = time.plusMinutes(3); // 20:33:06     arbeiten , Zeitoperationen sind jedoch normalerweise nicht so komplex, dass Modifikatoren erforderlich sind.
Datum und Uhrzeit kombinieren
    Die nächste Klasse, die wir uns ansehen werden, ist LocalDateTime . Diese Wertklasse ist eine Kombination aus LocalDate und LocalTime . Es stellt sowohl Datum als auch Uhrzeit dar, ohne Zeitzone.      LocalDateTime kann entweder direkt oder durch Kombination von Datum und Uhrzeit erstellt werden: LocalDateTime dt1 = LocalDateTime.of(2014, Month.JUNE, 10, 20, 30); LocalDateTime dt2 = LocalDateTime.of(date, time); LocalDateTime dt3 = date.atTime(20, 30); LocalDateTime dt4 = date.atTime(time);     Die dritte und vierte Option verwenden die Methode atTime() , die eine flexible Möglichkeit zur Kombination von Datum und Uhrzeit bietet. Die meisten Systemklassen für Datum und Uhrzeit verfügen über „at“-Methoden, die verwendet werden können, wenn Sie Ihr Objekt mit einem anderen kombinieren, um ein komplexeres Objekt zu erstellen. Die anderen Methoden der LocalDateTime- Klasse ähneln denen von LocalDate und LocalTime . Ähnliche Methodenbenennungsmuster erleichtern das Erlernen der API . In dieser Tabelle sind alle beteiligten Methodenpräfixe aufgeführt: Eine intuitive, robuste Bibliothek zum Arbeiten mit Zeiten und Daten ist endlich in Java verfügbar (Teil 2).  - 1
Sofortig
    Wenn wir uns mit Datums- und Zeitangaben befassen, arbeiten wir normalerweise mit Jahren, Monaten, Tagen, Stunden, Minuten, Sekunden. Dies ist jedoch nur ein Zeitmodell, das als „menschlich“ bezeichnet werden kann. Das zweite häufig verwendete Modell ist die „maschinelle“ oder „kontinuierliche“ Zeit. In diesem Modell wird ein Punkt auf der Zeitachse durch eine große Zahl dargestellt. Dieser Ansatz vereinfacht die Berechnungsalgorithmen und wird zum Speichern der Zeit im Unix- Betriebssystem verwendet , wobei die Zeit durch die Anzahl der Sekunden dargestellt wird, die seit dem 1. Januar 1970 vergangen sind. Ähnlich wird in Java die Zeit als die Anzahl der Millisekunden gespeichert, die seit dem 1. Januar 1970 vergangen sind. Der maschinelle Ansatz für Zeitberechnungen in der java.time-API wird von der Instant- Wertklasse bereitgestellt . Es bietet die Möglichkeit, einen Punkt auf einer Zeitachse ohne alle begleitenden Informationen, wie z. B. die Zeitzone, darzustellen. Tatsächlich enthält diese Klasse die Anzahl der Nanosekunden, die seit Mitternacht des 1. Januar 1970 vergangen sind. Instant start = Instant.now(); // произведем вычисления Instant end = Instant.now(); assert end.isAfter(start); //машина времени не сработала     Typischerweise wird die Instant- Klasse zum Speichern und Vergleichen von Zeitpunkten verwendet, wenn Sie speichern müssen, wann ein Ereignis stattgefunden hat, Ihnen aber die Zeitzone, in der es stattgefunden hat, egal ist. In den meisten Fällen ist es interessanter, was wir mit der Instant- Klasse nicht machen können , als was wir damit machen können. Die folgenden Codezeilen lösen beispielsweise Ausnahmen aus: instant.get(ChronoField.MONTH_OF_YEAR); instant.plus(6, ChronoUnit.YEARS);     Ausnahmen treten auf, weil das Instant- Objekt nur die Anzahl der Nanosekunden speichert und nicht die Möglichkeit bietet, mit Zeiteinheiten zu arbeiten, die für den Menschen nützlicher sind. Um andere Maßeinheiten zu verwenden, müssen Sie mindestens eine Zeitzone angeben.
Zeitzonen
    Das Prinzip der Zeitzonen wurde in England entwickelt, als die Erfindung der Eisenbahn und Verbesserungen anderer Kommunikationsmittel es den Menschen ermöglichten, Distanzen zurückzulegen, die ausreichten, um Unterschiede in der Sonnenzeit spürbar zu machen. Bis zu diesem Zeitpunkt lebte jedes Dorf und jede Stadt nach ihrer eigenen Zeit, die meist mit Sonnenuhren gemessen wurde. Dieses Bild zeigt ein Beispiel für die Schwierigkeiten, zu denen dies führte: Die roten Zeiger der Uhr zeigen die Greenwich-Zeit an und die schwarzen Zeiger zeigen die Ortszeit an, die um 10 Minuten abweicht: Das Zeitzonensystem entwickelte sich und löste die lokale Sonnenzeit ab Eine intuitive, robuste Bibliothek zum Arbeiten mit Zeiten und Daten ist endlich in Java verfügbar (Teil 2).  - 2     . Aber die entscheidende Tatsache ist, dass Zeitzonen von Politikern geschaffen werden und oft dazu dienen, die politische Kontrolle über ein Gebiet zu demonstrieren. Wie jede Richtlinie widersprechen Regeln im Zusammenhang mit Zeitzonen oft jeder Logik. Und außerdem können sich diese Regeln ändern, und zwar oft ohne Vorwarnung. Zeitzonenregeln werden von einer internationalen Gruppe zusammengestellt, die die IANA Time Zone Database veröffentlicht . Es enthält die Kennung jeder Region der Erde und den Verlauf der Zeitzonenänderungen für diese. Die Bezeichner sehen aus wie „Europa/London“ oder „Amerika/New_York“ . Vor der Veröffentlichung der java.time-API wurde die TimeZone- Klasse zur Darstellung einer Zeitzone verwendet . Jetzt wird stattdessen ZoneId verwendet . Es gibt zwei wesentliche Unterschiede zwischen ihnen. Erstens ist ZoneId unveränderlich, was es unter anderem ermöglicht, Objekte dieser Klasse in statischen Variablen zu speichern. Zweitens werden die Regeln selbst in der ZoneRules- Klasse und nicht in der ZoneId selbst gespeichert . Um sie abzurufen, müssen Sie die Methode getRules() für das ZoneId- Klassenobjekt aufrufen . Allen Zeitzonen gemeinsam ist ein fester Offset zu UTC/Greenwich . Am häufigsten verwenden Sie dies, wenn Sie über Zeitunterschiede zwischen verschiedenen Städten sprechen, z. B. „New York liegt 5 Stunden hinter London.“ Die ZoneOffset- Klasse , ein Nachkomme von ZoneId , stellt den Zeitunterschied zum Nullmeridian dar, der durch Greenwich in London verläuft. Aus Entwicklersicht wäre es großartig, sich nicht mit Zeitzonen und deren Komplexität auseinandersetzen zu müssen. Mit der java.time-API können Sie dies so lange wie möglich tun. Verwenden Sie nach Möglichkeit die Klassen LocalDate, LocalTime, LocalDateTime und Instant . Wenn Sie auf Zeitzonen nicht verzichten können, verwenden Sie die Klasse ZonedDateTime . ZonedDateTime- Klasse ermöglicht Ihnen die Umrechnung von Datums- und Uhrzeitangaben von menschlichen Maßeinheiten, die wir auf Kalendern und Uhren sehen, in maschinelle Einheiten. Daher können Sie ein ZonedTimeDate entweder aus der Local- Klasse oder aus der Instant-Klasse erstellen : ZoneId zone = ZoneId.of("Europe/Paris"); LocalDate date = LocalDate.of(2014, Month.JUNE, 10); ZonedDateTime zdt1 = date.atStartOfDay(zone); Instant instant = Instant.now(); ZonedDateTime zdt2 = instant.atZone(zone);     Eine der unangenehmsten Eigenschaften von Zeitzonen ist die sogenannte Sommerzeit. Mit der Umstellung auf Sommerzeit von und nach Greenwich ändert sich Ihr Zeitzonenunterschied zu Greenwich zweimal (oder öfter) im Jahr, wobei er normalerweise im Frühjahr zunimmt und im Herbst abnimmt. Wenn das passiert, müssen wir alle Uhren in unserem Haus umstellen. In den java.time- Klassen werden Offset-Daten als „Offset-Transformationen“ dargestellt . Im Frühjahr entsteht dadurch eine „Zeitlücke“, wenn manche Zeitwerte nicht möglich sind, im Herbst hingegen kommen manche Zeitwerte doppelt vor. All dies wird von der ZonedDateTime- Klasse durch ihre Factory-Methoden und Konvertermethoden unterstützt. Wenn Sie beispielsweise einen Tag hinzufügen, wird ein logischer Tag hinzugefügt, der durch mehr oder weniger als 24 Stunden dargestellt werden kann, wenn wir auf Sommerzeit umstellen oder zurück. Ebenso wird die Methode atStartOfDay() so benannt, da wir nicht garantieren können, dass der Tag genau um Mitternacht beginnt – wir müssen die Zeitlücke bei der Umstellung auf Sommerzeit berücksichtigen. Und noch ein letzter Tipp zur Sommerzeit. Wenn Sie nachweisen möchten, dass Sie Zeitüberschneidungen beim Übergang vom Sommer zum Winter berücksichtigt haben (wenn derselbe Zeitwert zweimal erscheint), können Sie eine von zwei speziellen Methoden verwenden, die für solche Situationen entwickelt wurden: Diese Methoden geben den früheren oder den späteren Wert zurück zdt = zdt.withEarlierOffsetAtOverlap(); zdt = zdt.withLaterOffsetAtOverlap();     Wert, wenn das Objekt beim Übergang von der Sommer- zur Winterzeit in eine Überlappung gerät. In allen anderen Situationen sind die Rückgabewerte gleich.
Zeitintervalle
    Alle Klassen, die wir zuvor besprochen haben, funktionieren als Punkte auf der Zeitleiste. Zur Darstellung von Zeitintervallen werden zwei zusätzliche Werteklassen benötigt. Die Klasse „Dauer“ stellt eine Zeitspanne dar, gemessen in Sekunden und Nanosekunden. Beispiel: „23,6 Sekunden“. Die Periodenklasse stellt einen Zeitraum dar, der in Jahren, Monaten und Tagen gemessen wird . Beispiel: „3 Jahre, 2 Monate und 6 Tage.“ Diese Intervalle können zu einem Datum oder einer Uhrzeit addiert oder davon subtrahiert werden: Period sixMonths = Period.ofMonths(6); LocalDate date = LocalDate.now(); LocalDate future = date.plus(sixMonths);
Formatieren und Parsen
    Ein ganzes Paket dient zum Formatieren und Anzeigen von Datums- und Uhrzeitangaben – java.time.format . Das Paket dreht sich um die DateTimeFormatter- Klasse und ihre DateTimeFormatterBuilder -Factory . Die gängigsten Methoden zum Erstellen eines Formatierers sind statische Methoden und Konstanten in DateTimeFormatter , darunter:
  • Konstanten für gängige Formate, die in ISO beschrieben werden, z. B. ISO_LOCAL_DATE.
  • Durch Buchstaben gekennzeichnete Muster, z. B. ofPattern("dd/MM/uuuu").
  • Lokalisierte Stile wie ofLocalizedDate(FormatStyle.MEDIUM).
    Sobald Sie einen Formatierer erstellt haben, verwenden Sie ihn normalerweise, indem Sie ihn an die entsprechende Datumsklassenmethode übergeben: DateTimeFormatter f = DateTimeFormatter.ofPattern("dd/MM/uuuu"); LocalDate date = LocalDate.parse("24/06/2014", f); String str = date.format(f);     Auf diese Weise wird der für die Formatierung der Datumsausgabe verantwortliche Code in einer separaten Klasse isoliert. Wenn Sie das Gebietsschema für die Datumsformatierung separat angeben müssen, verwenden Sie die Formatierungsmethode withLocale(Locale) . Die für den Kalender, die Zeitzone und die Ein-/Ausgabe von Bruchzahlen verantwortlichen Klassen verfügen über ähnliche Methoden. Wenn Sie weitere Feinabstimmungsoptionen benötigen, sehen Sie sich die Dokumentation zur DateTimeFormatterBuilder -Klasse an , mit der Sie Schritt für Schritt komplexe Formatierer erstellen können. Außerdem können Sie die Textanalyse ohne Berücksichtigung der Groß-/Kleinschreibung festlegen, einige Analysefehler ignorieren, Offsets und optionale Elemente festlegen.
Endeffekt
     Die java.time-API ist ein neues umfassendes Modell für die Arbeit mit Datum und Uhrzeit in Java SE 8 . Es bringt die Ideen und Implementierungen von Joda-Time auf die nächste Ebene und ermöglicht es Entwicklern endlich, auf die Verwendung von java.util.Date und Calendar zu verzichten . Jetzt kann die Arbeit mit Datum und Uhrzeit Spaß machen!      Originaler Artikel
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION