Java 8 - Nieuwe datum/tijd-API
Met Java 8 wordt een nieuwe Date-Time API geïntroduceerd om de volgende nadelen van de oude Date-Time API te dekken.
-
Niet threadveilig − java.util.Date is niet thread-safe, dus ontwikkelaars hebben te maken met gelijktijdigheidsproblemen tijdens het gebruik van date. De nieuwe datum-tijd-API is onveranderlijk en heeft geen setter-methoden.
-
Slecht ontwerp − Standaarddatum begint bij 1900, maand begint bij 1 en dag begint bij 0, dus geen uniformiteit. De oude API had minder directe methoden voor datumbewerkingen. De nieuwe API biedt tal van hulpprogramma's voor dergelijke bewerkingen.
-
Moeilijke afhandeling van tijdzones − Ontwikkelaars moesten veel code schrijven om tijdzoneproblemen op te lossen. De nieuwe API is ontwikkeld met het oog op een domeinspecifiek ontwerp.
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.
-
Lokaal − Vereenvoudigde datum-tijd-API zonder complexiteit van tijdzoneverwerking.
-
Gezoneerd − Gespecialiseerde datum-tijd-API om met verschillende tijdzones om te gaan.
Lokale datum-tijd-API
De klassen LocalDate/LocalTime en LocalDateTime vereenvoudigen de ontwikkeling waar tijdzones niet vereist zijn. Laten we ze in actie zien.
Maak het volgende java-programma met een editor naar keuze, bijvoorbeeld 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() { // Get the current date and time LocalDateTime currentTime = LocalDateTime.now(); System.out.println("Current 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("Month: " + month +"day: " + day +"seconds: " + 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 hour 15 minutes LocalTime date4 = LocalTime.of(22, 15); System.out.println("date4: " + date4); //parse a string LocalTime date5 = LocalTime.parse("20:15:30"); System.out.println("date5: " + date5); } }
Verifieer het resultaat
Stel de klas samen met javac compiler als volgt −
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester als volgt uit −
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren −
Current DateTime: 2014-12-09T11:00:45.457 date1: 2014-12-09 Month: DECEMBERday: 9seconds: 45 date2: 2012-12-10T11:00:45.457 date3: 2014-12-12 date4: 22:15 date5: 20:15:30
Gezoneerde datum-tijd-API
Gezoneerde datum-tijd-API moet worden gebruikt wanneer rekening moet worden gehouden met de tijdzone. Laten we ze in actie zien.
Maak het volgende Java-programma met een editor naar keuze, bijvoorbeeld 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() { // Get the current date and time 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); } }
Verifieer het resultaat
Stel de klas samen met javac compiler als volgt −
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester als volgt uit −
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 toegevoegd in Java 8 om de gehele waarden te vervangen die in de oude API werden gebruikt om dag, maand, enz. weer te geven. Laten we ze eens in actie zien.
Maak het volgende Java-programma met een editor naar keuze, bijvoorbeeld 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() { //Get the current date LocalDate today = LocalDate.now(); System.out.println("Current date: " + today); //add 1 week to the current date LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS); System.out.println("Next week: " + nextWeek); //add 1 month to the current date LocalDate nextMonth = today.plus(1, ChronoUnit.MONTHS); System.out.println("Next month: " + nextMonth); //add 1 year to the current date LocalDate nextYear = today.plus(1, ChronoUnit.YEARS); System.out.println("Next year: " + nextYear); //add 10 years to the current date LocalDate nextDecade = today.plus(1, ChronoUnit.DECADES); System.out.println("Date after ten year: " + nextDecade); } }
Verifieer het resultaat
Stel de klas samen met javac compiler als volgt −
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester als volgt uit −
C:\JAVA>java Java8Tester
Het zou het volgende resultaat moeten opleveren −
Current date: 2014-12-10 Next week: 2014-12-17 Next month: 2015-01-10 Next year: 2015-12-10 Date after ten year: 2024-12-10
Periode en duur
Met Java 8 worden twee gespecialiseerde klassen geïntroduceerd om met de tijdsverschillen om te gaan.
-
Periode − Het gaat over op datum gebaseerde hoeveelheid tijd.
-
Duur − Het gaat over op tijd gebaseerde hoeveelheid tijd.
Laten we ze in actie zien.
Maak het volgende Java-programma met een editor naar keuze, bijvoorbeeld 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() { //Get the current date LocalDate date1 = LocalDate.now(); System.out.println("Current date: " + date1); //add 1 month to the current date LocalDate date2 = date1.plus(1, ChronoUnit.MONTHS); System.out.println("Next month: " + 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); } }
Verifieer het resultaat
Stel de klas samen met javac compiler als volgt −
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester als volgt uit −
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren −
Current date: 2014-12-10 Next month: 2015-01-10 Period: P-1M Duration: PT2H
Tijdelijke Richters
TemporalAdjuster wordt gebruikt om de datumwiskunde uit te voeren. Ontvang bijvoorbeeld de "Tweede zaterdag van de maand" of "Volgende dinsdag". Laten we ze in actie zien.
Maak het volgende Java-programma met een editor naar keuze, bijvoorbeeld 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() { //Get the current date LocalDate date1 = LocalDate.now(); System.out.println("Current date: " + date1); //get the next tuesday LocalDate nextTuesday = date1.with(TemporalAdjusters.next(DayOfWeek.TUESDAY)); System.out.println("Next Tuesday on : " + nextTuesday); //get the second saturday of next month 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("Second Saturday on : " + secondSaturday); } }
Verifieer het resultaat
Stel de klas samen met javac compiler als volgt −
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester als volgt uit −
C:\JAVA>java Java8Tester
Het zou het volgende resultaat moeten opleveren −
Current date: 2014-12-10 Next Tuesday on : 2014-12-16 Second Saturday on : 2014-12-13
Achterwaartse compatibiliteit
Er is een methode toInstant() toegevoegd aan de oorspronkelijke objecten Date en Calendar, die kan worden gebruikt om ze te converteren naar de nieuwe Date-Time API. Gebruik een methode ofInstant(Insant,ZoneId) om een LocalDateTime- of ZonedDateTime-object op te halen. Laten we ze in actie zien.
Maak het volgende Java-programma met een editor naar keuze, bijvoorbeeld 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() { //Get the current date Date currentDate = new Date(); System.out.println("Current date: " + currentDate); //Get the instant of current date in terms of milliseconds Instant now = currentDate.toInstant(); ZoneId currentZone = ZoneId.systemDefault(); LocalDateTime localDateTime = LocalDateTime.ofInstant(now, currentZone); System.out.println("Local date: " + localDateTime); ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(now, currentZone); System.out.println("Zoned date: " + zonedDateTime); } }
Verifieer het resultaat
Stel de klas samen met javac compiler als volgt −
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester als volgt uit −
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren −
Current date: Wed Dec 10 05:44:06 UTC 2014 Local date: 2014-12-10T05:44:06.635 Zoned date: 2014-12-10T05:44:06.635Z[Etc/UTC]
Java