Java bietet endlich eine intuitive und zuverlässige Möglichkeit, mit Datums- und Uhrzeitangaben zu arbeiten. Die Prinzipien von Datum und Uhrzeit sind in vielen Anwendungen von grundlegender Bedeutung. Verschiedene Dinge wie Geburtsdaten, Mietdaten, Veranstaltungszeiten und Ladenöffnungszeiten basieren alle auf Datum und Uhrzeit, aber Java SE bot keine bequeme Möglichkeit, damit zu arbeiten. Ab Java SE 8 gab es eine Reihe von java.time- Paketen , die eine gut strukturierte API für die Arbeit mit Datums- und Uhrzeitangaben bereitstellen.
Hier ist eine kleine Liste bestehender Probleme bei der Umsetzung:
Hintergrund
Als Java in Version 1.0 zum ersten Mal herauskam , war java.util.Date die einzige Klasse für die Arbeit mit Datums- und Uhrzeitangaben . Das erste, was den Entwicklern auffiel, war, dass es sich nicht um ein „Datum“ handelte. Tatsächlich stellt es einen auf Millisekunden genauen Zeitpunkt dar, gemessen ab dem 1. Januar 1970. Aufgrund der Tatsache, dass die toString()- Methode von Date Datum und Uhrzeit in der in den Java- Einstellungen der Maschine angegebenen Zeitzone anzeigt , kamen einige Entwickler jedoch fälschlicherweise zu dem Schluss, dass Date mit Zeitzonen arbeiten kann. Das Reparieren dieser Klasse erwies sich als so schwierig (oder so faul), dass wir in Version 1.1 eine neue Klasse hinzufügen mussten – java.util.Calendar . Leider erwies sich die Klasse Calendar als nicht viel besser als Date .- Veränderbar. Klassen wie Datum und Uhrzeit sollten unveränderlich sein.
- Offsets. Die Jahre in der Datumsklasse beginnen bei 1900, die Monate in beiden Klassen beginnen bei Null.
- Namen. „Datum“ ist eigentlich kein „Datum“, und „Kalender“ ist kein Kalender.
- Formatierung. Die Formatierung funktioniert nur mit Datum, nicht mit Kalender, und ist nicht threadsicher.
Rezension
Die neue java.time API enthält 5 Pakete:- java.time – das Basispaket, das Objekte zum Speichern von Werten enthält
- java.time.chrono – bietet Zugriff auf verschiedene Kalender
- java.time.format – Formatierung und Erkennung von Datum und Uhrzeit
- java.time.temporal – Low-Level-Bibliotheken und erweiterte Funktionalität
- java.time.zone – Klassen für die Arbeit mit Zeitzonen
Termine
Die LocalDate- Klasse ist eine der wichtigsten in der neuen API . Es enthält einen unveränderlichen Wert, der ein Datum darstellt. Sie können weder die Uhrzeit noch die Zeitzone einstellen. Der Name „local“ ist Ihnen vielleicht von Joda-Time bekannt und stammt ursprünglich aus dem ISO-8601- Standard . Es bedeutet genau das Fehlen einer Zeitzone. Im Wesentlichen handelt es sich bei LocalDate um eine Beschreibung eines Datums, beispielsweise „5. April 2014“. Die tatsächliche Uhrzeit dieses Datums hängt von Ihrer Zeitzone ab. In Australien liegt dieses Datum beispielsweise 10 Stunden früher als in London und 18 Stunden früher als in San Francisco. Die LocalDate- Klasse verfügt über alle häufig benötigten Methoden:LocalDate date = LocalDate.of(2014, Month.JUNE, 10); int year = date.getYear(); // 2014 Month month = date.getMonth(); // Июнь int dom = date.getDayOfMonth(); // 10 DayOfWeek dow = date.getDayOfWeek(); // Вторник int len = date.lengthOfMonth(); // 30 (дней в Июне) boolean leap = date.isLeapYear(); // false (не високосный год)
In unserem Beispiel sehen wir ein Datum, das mit einer Factory-Methode erstellt wurde (alle Konstruktoren sind privat). Als nächstes fragen wir das Objekt nach einigen Daten. Bitte beachten Sie, dass
die Aufzählungen „Month“ und
„DayOfWeek“ dazu dienen, den Code lesbarer und zuverlässiger zu machen. Im folgenden Beispiel sehen wir, wie man das Datum ändert. Da die Klasse unveränderlich ist, werden als Ergebnis neue Objekte entstehen, das Original bleibt jedoch so, wie es war.
LocalDate date = LocalDate.of(2014, Month.JUNE, 10); date = date.withYear(2015); // 2015-06-10 date = date.plusMonths(2); // 2015-08-10 date = date.minusDays(1); // 2015-08-09
Dabei handelt es sich um relativ einfache Änderungen, häufig müssen jedoch komplexere Datumsänderungen vorgenommen werden. Dafür gibt es einen speziellen Mechanismus in
der java.time API – TemporalAdjuster . Sein Zweck besteht darin, ein integriertes Tool bereitzustellen, mit dem Sie Datumsangaben manipulieren können, beispielsweise um ein Objekt abzurufen, das dem letzten Tag des Monats entspricht. Einige davon sind in
der API enthalten , Sie können jedoch Ihre eigenen hinzufügen. Die Verwendung von Modifikatoren ist sehr einfach, erfordert jedoch statische Importe:
import static java.time.DayOfWeek.* import static java.time.temporal.TemporalAdjusters.* LocalDate date = LocalDate.of(2014, Month.JUNE, 10); date = date.with(lastDayOfMonth()); date = date.with(nextOrSame(WEDNESDAY));
Die Verwendung von Modifikatoren vereinfacht Ihren Code erheblich. Niemand möchte viel manuelle Datumsmanipulation sehen. Wenn in Ihrem Projekt mehrmals eine Datumsmanipulation auftritt, schreiben Sie Ihren eigenen Modifikator und Ihr Team kann ihn als bereits geschriebene und getestete Komponente verwenden.
GO TO FULL VERSION