Java 8: De Robuuste Nieuwe Date/Time API
Met Java 8 wordt een nieuwe Date-Time API geïntroduceerd om de volgende tekortkomingen van de oude date-time API op te lossen:
Niet thread-safe − java.util.Date is niet thread-safe, waardoor ontwikkelaars te maken krijgen met gelijktijdigheidsproblemen. De nieuwe date-time API is immuteerbaar en heeft geen setter-methoden.
Slecht ontwerp − Standaard Date begint bij 1900, maand begint bij 1, en dag begint bij 0, wat geen uniformiteit oplevert. De oude API had minder directe methoden voor datumoperaties. De nieuwe API biedt talloze hulpmethoden voor dergelijke operaties.
Moeilijke tijdzone-afhandeling − Ontwikkelaars moesten veel code schrijven om om te gaan met timezone-kwesties. De nieuwe API is ontwikkeld met domeinspecifiek ontwerp in gedachten.
Java 8 introduceert een nieuwe date-time API onder het pakket java.time. Hieronder volgen enkele van de belangrijke klassen die in het java.time-pakket zijn geïntroduceerd:
Local − Vereenvoudigde date-time API zonder de complexiteit van timezone-afhandeling.
Zoned − Gespecialiseerde date-time API om met diverse timezones om te gaan.
Local Date-Time API
LocalDate, LocalTime en LocalDateTime klassen vereenvoudigen de ontwikkeling waar timezones niet vereist zijn. Laten we ze in actie zien.
Maak het volgende Java-programma aan met een editor naar keuze in, zeg, C:\> JAVA.
Java8Tester.java
Live Demoimport java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;
import java.time.Month;
public class Java8Tester {
public static void main(String args[]) {
Java8Tester java8tester = new Java8Tester();
java8tester.testLocalDateTime();
}
public void testLocalDateTime() {
// Haal de huidige datum en tijd op
LocalDateTime currentTime = LocalDateTime.now();
System.out.println("Huidige DateTime: " + currentTime);
LocalDate date1 = currentTime.toLocalDate();
System.out.println("date1: " + date1);
Month month = currentTime.getMonth();
int day = currentTime.getDayOfMonth();
int seconds = currentTime.getSecond();
System.out.println("Maand: " + month + " dag: " + day + " seconden: " + seconds);
LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2012);
System.out.println("date2: " + date2);
// 12 december 2014
LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12);
System.out.println("date3: " + date3);
// 22 uur 15 minuten
LocalTime date4 = LocalTime.of(22, 15);
System.out.println("date4: " + date4);
// Parse een string
LocalTime date5 = LocalTime.parse("20:15:30");
System.out.println("date5: " + date5);
}
}
Resultaat Verifiëren
Compileer de klasse met de javac compiler als volgt:
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester uit als volgt:
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren:
Huidige DateTime: 2014-12-09T11:00:45.457 date1: 2014-12-09 Maand: DECEMBER dag: 9 seconden: 45 date2: 2012-12-10T11:00:45.457 date3: 2014-12-12 date4: 22:15 date5: 20:15:30
Zoned Date-Time API
Zoned date-time API wordt gebruikt wanneer tijdzone in aanmerking moet worden genomen. Laten we ze in actie zien.
Maak het volgende Java-programma aan met een editor naar keuze in, zeg, C:\> JAVA.
Java8Tester.java
Live Demoimport java.time.ZonedDateTime;
import java.time.ZoneId;
public class Java8Tester {
public static void main(String args[]) {
Java8Tester java8tester = new Java8Tester();
java8tester.testZonedDateTime();
}
public void testZonedDateTime() {
// Haal de huidige datum en tijd op
ZonedDateTime date1 = ZonedDateTime.parse("2007-12-03T10:15:30+05:30[Asia/Karachi]");
System.out.println("date1: " + date1);
ZoneId id = ZoneId.of("Europe/Paris");
System.out.println("ZoneId: " + id);
ZoneId currentZone = ZoneId.systemDefault();
System.out.println("CurrentZone: " + currentZone);
}
}
Resultaat Verifiëren
Compileer de klasse met de javac compiler als volgt:
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester uit als volgt:
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren:
date1: 2007-12-03T10:15:30+05:00[Asia/Karachi] ZoneId: Europe/Paris CurrentZone: Etc/UTC
Chrono Units Enum
java.time.temporal.ChronoUnit enum is in Java 8 toegevoegd om de gehele waarden te vervangen die in de oude API werden gebruikt om dag, maand, etc. weer te geven. Laten we ze in actie zien.
Maak het volgende Java-programma aan met een editor naar keuze in, zeg, C:\> JAVA.
Java8Tester.java
Live Demoimport java.time.LocalDate;
import java.time.temporal.ChronoUnit;
public class Java8Tester {
public static void main(String args[]) {
Java8Tester java8tester = new Java8Tester();
java8tester.testChromoUnits();
}
public void testChromoUnits() {
// Haal de huidige datum op
LocalDate today = LocalDate.now();
System.out.println("Huidige datum: " + today);
// Voeg 1 week toe aan de huidige datum
LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
System.out.println("Volgende week: " + nextWeek);
// Voeg 1 maand toe aan de huidige datum
LocalDate nextMonth = today.plus(1, ChronoUnit.MONTHS);
System.out.println("Volgende maand: " + nextMonth);
// Voeg 1 jaar toe aan de huidige datum
LocalDate nextYear = today.plus(1, ChronoUnit.YEARS);
System.out.println("Volgend jaar: " + nextYear);
// Voeg 10 jaar toe aan de huidige datum
LocalDate nextDecade = today.plus(1, ChronoUnit.DECADES);
System.out.println("Datum over tien jaar: " + nextDecade);
}
}
Resultaat Verifiëren
Compileer de klasse met de javac compiler als volgt:
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester uit als volgt:
C:\JAVA>java Java8Tester
Het zou het volgende resultaat moeten produceren:
Huidige datum: 2014-12-10 Volgende week: 2014-12-17 Volgende maand: 2015-01-10 Volgend jaar: 2015-12-10 Datum over tien jaar: 2024-12-10
Period en Duration
Met Java 8 worden twee gespecialiseerde klassen geïntroduceerd om met tijdsverschillen om te gaan:
Period − Het gaat om datum-gebaseerde hoeveelheden tijd.
Duration − Het gaat om tijd-gebaseerde hoeveelheden tijd.
Laten we ze in actie zien.
Maak het volgende Java-programma aan met een editor naar keuze in, zeg, C:\> JAVA.
Java8Tester.java
Live Demoimport java.time.temporal.ChronoUnit;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.Duration;
import java.time.Period;
public class Java8Tester {
public static void main(String args[]) {
Java8Tester java8tester = new Java8Tester();
java8tester.testPeriod();
java8tester.testDuration();
}
public void testPeriod() {
// Haal de huidige datum op
LocalDate date1 = LocalDate.now();
System.out.println("Huidige datum: " + date1);
// Voeg 1 maand toe aan de huidige datum
LocalDate date2 = date1.plus(1, ChronoUnit.MONTHS);
System.out.println("Volgende maand: " + date2);
Period period = Period.between(date2, date1);
System.out.println("Period: " + period);
}
public void testDuration() {
LocalTime time1 = LocalTime.now();
Duration twoHours = Duration.ofHours(2);
LocalTime time2 = time1.plus(twoHours);
Duration duration = Duration.between(time1, time2);
System.out.println("Duration: " + duration);
}
}
Resultaat Verifiëren
Compileer de klasse met de javac compiler als volgt:
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester uit als volgt:
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren:
Huidige datum: 2014-12-10 Volgende maand: 2015-01-10 Period: P-1M Duration: PT2H
Temporal Adjusters
TemporalAdjuster wordt gebruikt om datum-wiskunde uit te voeren. Bijvoorbeeld: "Tweede zaterdag van de maand" of "Volgende dinsdag". Laten we ze in actie zien.
Maak het volgende Java-programma aan met een editor naar keuze in, zeg, C:\> JAVA.
Java8Tester.java
Live Demoimport java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.time.DayOfWeek;
public class Java8Tester {
public static void main(String args[]) {
Java8Tester java8tester = new Java8Tester();
java8tester.testAdjusters();
}
public void testAdjusters() {
// Haal de huidige datum op
LocalDate date1 = LocalDate.now();
System.out.println("Huidige datum: " + date1);
// Haal de volgende dinsdag op
LocalDate nextTuesday = date1.with(TemporalAdjusters.next(DayOfWeek.TUESDAY));
System.out.println("Volgende dinsdag op: " + nextTuesday);
// Haal de tweede zaterdag van de volgende maand op
LocalDate firstInYear = LocalDate.of(date1.getYear(), date1.getMonth(), 1);
LocalDate secondSaturday = firstInYear.with(TemporalAdjusters.nextOrSame(DayOfWeek.SATURDAY))
.with(TemporalAdjusters.next(DayOfWeek.SATURDAY));
System.out.println("Tweede zaterdag op: " + secondSaturday);
}
}
Resultaat Verifiëren
Compileer de klasse met de javac compiler als volgt:
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester uit als volgt:
C:\JAVA>java Java8Tester
Het zou het volgende resultaat moeten produceren:
Huidige datum: 2014-12-10 Volgende dinsdag op: 2014-12-16 Tweede zaterdag op: 2014-12-13
Backward Compatibiliteit
Een toInstant()-methode is toegevoegd aan de oorspronkelijke Date- en Calendar-objecten, die gebruikt kan worden om ze te converteren naar de nieuwe Date-Time API. Gebruik een ofInstant(Instant, ZoneId)-methode om een LocalDateTime- of ZonedDateTime-object te krijgen. Laten we ze in actie zien.
Maak het volgende Java-programma aan met een editor naar keuze in, zeg, C:\> JAVA.
Java8Tester.java
Live Demoimport java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.util.Date;
import java.time.Instant;
import java.time.ZoneId;
public class Java8Tester {
public static void main(String args[]) {
Java8Tester java8tester = new Java8Tester();
java8tester.testBackwardCompatability();
}
public void testBackwardCompatability() {
// Haal de huidige datum op
Date currentDate = new Date();
System.out.println("Huidige datum: " + currentDate);
// Haal het instant van de huidige datum op in milliseconden
Instant now = currentDate.toInstant();
ZoneId currentZone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(now, currentZone);
System.out.println("Lokale datum: " + localDateTime);
ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(now, currentZone);
System.out.println("Zoned datum: " + zonedDateTime);
}
}
Resultaat Verifiëren
Compileer de klasse met de javac compiler als volgt:
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester uit als volgt:
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren:
Huidige datum: Wed Dec 10 05:44:06 UTC 2014 Lokale datum: 2014-12-10T05:44:06.635 Zoned datum: 2014-12-10T05:44:06.635Z[Etc/UTC]
Java
- Uitgebreide Gids voor Datum en Tijd in C++
- Huidige datum en tijd ophalen in Python: een praktische gids
- Java-operators beheersen: typen, syntax en praktische voorbeelden
- Java-commentaar: typen, gebruik en best practices
- Java interfaces meesteren: concepten, implementatie en best practices
- Java Try-with-resources meesteren: automatische resource management uitgelegd
- Java Annotaties uitgelegd: typen, plaatsing en praktische voorbeelden
- Java Datum en Tijd Onder de Knie: Constructors, Methods & Best Practices
- Java 10 introduceert Time-Based Release Versioning voor voorspelbare halfjaarlijkse updates
- Java 10: 70+ nieuwe API's & features uitgelegd
- Java 9 (JDK 9) – Belangrijkste kenmerken & voordelen