Datumtijd API is een van de grootste functies van de Java 8-release. Java miste vanaf het begin een consistente aanpak voor Datum en Tijd en de Java 8 Datumtijd API is een welkome toevoeging aan de kern-Java-API’s.
Waarom hebben we een nieuwe Java Datumtijd API nodig?
Voordat we naar de Java 8 Datumtijd API gaan kijken, laten we eens kijken waarom we een nieuwe API hiervoor nodig hebben. Er zijn verschillende problemen geweest met de bestaande datum- en tijdgerelateerde klassen in Java, enkele daarvan zijn:
- Java Datumtijd-klassen zijn niet consistent gedefinieerd, we hebben de Datumklasse zowel in de java.util- als in de java.sql-pakketten. Opnieuw zijn opmaak- en analyseklassen gedefinieerd in het java.text-pakket.
- java.util.Date bevat zowel datum- als tijdwaarden, terwijl java.sql.Date alleen een datumwaarde bevat. Het feit dat dit in het java.sql-pakket staat, heeft geen zin. Bovendien hebben beide klassen dezelfde naam, wat op zich al een zeer slecht ontwerp is.
- Er zijn geen duidelijk gedefinieerde klassen voor tijd, tijdstempel, opmaak en analyse. We hebben de abstracte klasse java.text.DateFormat voor de analyse- en opmaakbehoeften. Gewoonlijk wordt de klasse SimpleDateFormat gebruikt voor analyse en opmaak.
- Alle Datumklassen zijn veranderlijk, dus ze zijn niet thread-safe. Het is een van de grootste problemen met de Java Datum- en Kalenderklassen.
- De Date-klasse biedt geen internationalisatie, er is geen ondersteuning voor tijdzones. Dus de klassen java.util.Calendar en java.util.TimeZone werden geïntroduceerd, maar ze hebben ook alle bovenstaande problemen.
Er zijn nog enkele andere problemen met de methoden gedefinieerd in de Date- en Calendar-klassen, maar bovenstaande problemen maken duidelijk dat er een robuuste Date Time API nodig was in Java. Daarom speelde Joda Time een sleutelrol als kwalitatieve vervanging voor Java Date Time vereisten.
Ontwerpprincipes Java 8 Date Time
De Java 8 Date Time API is een implementatie van JSR-310. Het is ontworpen om alle gebreken in de verouderde datumtijd-implementaties te overwinnen. Enkele van de ontwerpprincipes van de nieuwe Date Time API zijn:
-
Onveranderlijkheid: Alle klassen in de nieuwe Date-Time API zijn onveranderlijk en goed voor multithreaded omgevingen.
-
Scheiding van belangen: De nieuwe API scheidt duidelijk tussen menselijk leesbare datumtijd en machinetijd (Unix-tijdstempel). Het definieert afzonderlijke klassen voor Datum, Tijd, DatumTijd, Tijdstip, Tijdzone, enz.
-
Duidelijkheid: De methoden zijn duidelijk gedefinieerd en voeren dezelfde actie uit in alle klassen. Bijvoorbeeld, om de huidige instantie te krijgen hebben we de methode nu(). Er zijn format() en parse() methoden gedefinieerd in al deze klassen in plaats van een aparte klasse ervoor te hebben.
Alle klassen gebruiken het Factory Patroon en het Strategie Patroon voor betere afhandeling. Eenmaal de methoden in een van de klassen te hebben gebruikt, zal het werken met andere klassen niet moeilijk zijn.
-
Nuttigheidsoperaties: Alle nieuwe klassen van de Date-Time API worden geleverd met methoden om veelvoorkomende taken uit te voeren, zoals optellen, aftrekken, opmaken, parsen, het verkrijgen van het afzonderlijke deel in datum/tijd, enz.
-
Uitbreidbaar: De nieuwe Date Time API werkt op het ISO-8601-kalendersysteem, maar we kunnen het ook gebruiken met andere niet-ISO-kalenders.
Datumtijd-API-pakketten
De Java 8 Date Time API bestaat uit de volgende pakketten.
- java.time: Dit is het basispakket van de nieuwe Java Date Time API. Alle belangrijke basisklassen maken deel uit van dit pakket, zoals LocalDate, LocalTime, LocalDateTime, Instant, Period, Duration, enz. al deze klassen zijn onveranderlijk en thread-safe. Meestal zullen deze klassen voldoende zijn voor het afhandelen van gemeenschappelijke vereisten.
- java.time.chrono: Dit pakket definieert generieke API’s voor niet-ISO-kalendersystemen. We kunnen de klasse AbstractChronology uitbreiden om ons eigen kalendersysteem te maken.
- java.time.format: Deze package bevat klassen die worden gebruikt voor het formatteren en parseren van datum-tijdobjecten. Meestal gebruiken we ze niet direct omdat de hoofdklassen in het java.time-pakket methoden voor formatteren en parseren bieden.
- java.time.temporal: Deze package bevat temporale objecten en we kunnen deze gebruiken om specifieke data of tijden met betrekking tot datum/tijdobjecten te vinden. Bijvoorbeeld, we kunnen deze gebruiken om de eerste of laatste dag van de maand te vinden. Je kunt deze methoden gemakkelijk herkennen omdat ze altijd de indeling “withXXX” hebben.
- java.time.zone Package: Deze package bevat klassen voor het ondersteunen van verschillende tijdzones en hun regels.
Java 8 Date Time API-klassen Voorbeelden
We hebben de belangrijkste onderdelen van de Java Date Time API bekeken. Het is nu tijd om de belangrijkste klassen van de Date Time API te bekijken met voorbeelden.
1. LocalDate
LocalDate is een onveranderlijke klasse die een datum vertegenwoordigt met het standaard formaat yyyy-MM-dd. We kunnen de methode now() gebruiken om de huidige datum te krijgen. We kunnen ook invoerargumenten voor jaar, maand en datum verstrekken om een LocalDate-instantie te maken.
Deze klasse biedt een overbelaste methode voor now() waarbij we ZoneId kunnen doorgeven om datums te krijgen in een specifieke tijdzone. Deze klasse biedt dezelfde functionaliteit als java.sql.Date.
Er wordt uitleg gegeven over de methoden van LocalDate in de opmerkingen. Wanneer we dit programma uitvoeren, krijgen we de volgende uitvoer.
2. LocalTime
LocalTime is een onveranderlijke klasse waarvan een instantie een tijd in het leesbare formaat van mensen vertegenwoordigt. De standaardindeling is hh:mm:ss.zzz. Net als LocalDate biedt deze klasse ondersteuning voor tijdzones en het maken van een instantie door uur, minuut en seconde als invoerargumenten door te geven.
Output:
3. LocalDateTime
LocalDateTime is een onveranderlijk datum-tijd object dat een datum-tijd voorstelt met standaard formaat als yyyy-MM-dd-HH-mm-ss.zzz. Het biedt een fabrieksmethode die LocalDate en LocalTime invoerargumenten gebruikt om een LocalDateTime-instantie te maken.
In alle drie voorbeelden hebben we gezien dat als we ongeldige argumenten verstrekken voor het maken van Datum/Tijd, het een java.time.DateTimeException genereert, wat een RuntimeException is, dus we hoeven het niet expliciet op te vangen.
We hebben ook gezien dat we Datum/Tijd-gegevens kunnen krijgen door ZoneId door te geven, je kunt de lijst met ondersteunde ZoneId-waarden krijgen vanuit zijn JavaDoc. Wanneer we de bovenstaande klasse uitvoeren, krijgen we de volgende uitvoer.
4. Instant
Instant-klasse wordt gebruikt om te werken met machinaal leesbaar tijdsformaat. Instant slaat datumtijd op in Unix-timestamp.
Output:
Java 8 Datum API Hulpprogramma’s
De meeste principeklassen van Datum Tijd bieden verschillende hulpprogramma-methoden zoals plus/min dagen, weken, maanden, enz. Er zijn enkele andere hulpprogramma-methoden voor het aanpassen van de datum met behulp van TemporalAdjuster
en om de periode tussen twee data te berekenen.
Output:
Java 8 Datumanalyse en -formattering
Het is zeer gebruikelijk om een datum in verschillende formaten weer te geven en vervolgens een String te parsen om de Datum Tijd objecten te verkrijgen.
Output:
Java Date API Legacy Date Time Ondersteuning
Legacy Datum/Tijd klassen worden in bijna alle applicaties gebruikt, dus achterwaartse compatibiliteit is een must. Daarom zijn er verschillende hulpprogramma-methoden waarmee we Legacy klassen naar nieuwe klassen en vice versa kunnen converteren.
Output:
Zoals je kunt zien zijn de toString() methoden van de legacy TimeZone
en GregorianCalendar
klassen te uitgebreid en niet gebruiksvriendelijk.
Conclusie
I like this new Date Time API a lot. Some of the most used classes will be LocalDate and LocalDateTime. It’s very easy to work with the new classes. And, having similar methods that does a particular job makes it easy to find. It will take some time from moving legacy classes to new Date Time classes, but I believe it will be worth the time and effort.
Source:
https://www.digitalocean.com/community/tutorials/java-8-date-localdate-localdatetime-instant