Wissen wie spät es ungefähr sein könnte - Das neue Date...

17
18.07.2014 1 aformatik Training & Consulting GmbH & Co. KG 1 Wissen, wie spät es ungefähr sein könnte Das neue Date/Time API von JDK 8 Nikolaos Ntaountakis aformatik Training & Consulting GmbH & Co. KG 2 Das bisherige API - Date nicht intuitiv nicht immutable, nicht threadsicher die meisten Methoden sind veraltet (deprecated) Date date1 = new Date(2014, 12, 30, 11, 50); Date date2 = new Date(2014, 1, 30, 11, 50); date1.toString(); // Sun Jan 30 11:50:00 CET 3915 date2.toString(); // Tue Mar 02 11:50:00 CET 3914

Transcript of Wissen wie spät es ungefähr sein könnte - Das neue Date...

Page 1: Wissen wie spät es ungefähr sein könnte - Das neue Date ...2014.java-forum-stuttgart.de/_data/D3_2014.pdf · aformatik Training & Consulting GmbH & Co. KG 8 JSR 310 - Überblick

18.07.2014

1

aformatik Training & Consulting GmbH & Co. KG 1

Wissen, wie spät es ungefähr sein könnte

Das neue Date/Time API von JDK 8

Nikolaos Ntaountakis

aformatik Training & Consulting GmbH & Co. KG 2

Das bisherige API - Date

nicht intuitiv

nicht immutable, nicht threadsicher

die meisten Methoden sind veraltet (deprecated)

Date date1 = new Date(2014, 12, 30, 11, 50);

Date date2 = new Date(2014, 1, 30, 11, 50);

date1.toString(); // Sun Jan 30 11:50:00 CET 3915

date2.toString(); // Tue Mar 02 11:50:00 CET 3914

Page 2: Wissen wie spät es ungefähr sein könnte - Das neue Date ...2014.java-forum-stuttgart.de/_data/D3_2014.pdf · aformatik Training & Consulting GmbH & Co. KG 8 JSR 310 - Überblick

18.07.2014

2

aformatik Training & Consulting GmbH & Co. KG 3

Das bisherige API - Calendar

duale interne Darstellung

Millisekunden

Datum-Felder

Jahr 0 ist nicht mehr 1900, aber Januar ist immer noch 0

nicht immutable, nicht threadsicher

unflexibel

anfällig für Fehlbenutzung

TimeZone zone = TimeZone.getTimeZone("Europe/Athen");

Calendar cal = new GregorianCalendar(zone);

System.out.println(zone.getDisplayName()); // Greenwich Zeit

aformatik Training & Consulting GmbH & Co. KG 4

Das bisherige API - java.sql.Date/Time/Timestamp

Unterklassen von java.util.Date

beinhalten überflüssige Informationen

java.sql.Date date =

new java.sql.Date(System.currentTimeMillis());

Integer id = 1;

insertDateInDB(id, date);

java.sql.Date dateAusDB = getDateFromDB(id);

System.out.println(

date.equals(dateAusDB)? "Gut so!" : "Wieso nicht?");

// Wieso nicht?

Page 3: Wissen wie spät es ungefähr sein könnte - Das neue Date ...2014.java-forum-stuttgart.de/_data/D3_2014.pdf · aformatik Training & Consulting GmbH & Co. KG 8 JSR 310 - Überblick

18.07.2014

3

JSR 310

Das neue API

von JDK 8

aformatik Training & Consulting GmbH & Co. KG 6

Übersicht

JSR 310 – Überblick

Zeitskalen

maschinelle Zeitskala

menschliche Zeitskala

Verwendung

allgemeine Methoden

allgemeine Interfaces

Felderzugriff

Diverses

Adjusters, Queries

Integration

Gefahrenherde

Page 4: Wissen wie spät es ungefähr sein könnte - Das neue Date ...2014.java-forum-stuttgart.de/_data/D3_2014.pdf · aformatik Training & Consulting GmbH & Co. KG 8 JSR 310 - Überblick

18.07.2014

4

aformatik Training & Consulting GmbH & Co. KG 7

1.

Überblick

aformatik Training & Consulting GmbH & Co. KG 8

JSR 310 - Überblick (1)

JSR 310: Date and Time API

Specification Lead: Stephen Colebourne, Michael Nascimento Santos, Roger Riggs (Oracle)

Start: Januar 2007

28. Mar. 2010: Early Draft Review

Sep. 2011: Oracle als Co-spec lead

14. Okt. 2012: Early Draft Review 2

4. Dez. 2013: Public Review

14. Jan. 2014: Proposed Final Draft

18. Mar. 2014: JDK 8 Release

Projekt Homepage: http://www.threeten.org/

2. Juli 2009: JFS, JSR 310 Date/Time

28. Juli 2011: JDK 7 Release

Page 5: Wissen wie spät es ungefähr sein könnte - Das neue Date ...2014.java-forum-stuttgart.de/_data/D3_2014.pdf · aformatik Training & Consulting GmbH & Co. KG 8 JSR 310 - Überblick

18.07.2014

5

aformatik Training & Consulting GmbH & Co. KG 9

JSR 310 - Überblick (2)

zwei Zeitskalen für zwei Arten von Datumsklassen

„maschinelle“ (Nanosekunden-basiert)

„menschliche“ (Feld-basiert)

immutable Objekte (Thread Sicherheit, Eignung für Singletons)

Konstruktion über Factories

sprechende Methoden und konsistente Methodenbenennung

Interfaces für leichte Integration und Erweiterbarkeit

ausführliche Dokumentation (javadoc)

aformatik Training & Consulting GmbH & Co. KG 10

JSR 310 - Überblick (3)

Pakete:

java.time : ISO Haupt-Kalendar

konkrete Implementierung des ISO-Kalenders

java.time.chrono : regionale Kalender

allgemeine Kalender-Klassen

konkrete Kalender Implementierungen

java.time.format : Parsen und Formatieren

java.time.temporal : Framework

Einheiten/Felder

allgemeine, Kalender-unabhängige Interfaces

java.time.zone : Zeitzonen

Regeln und Zeitverschiebungen

Page 6: Wissen wie spät es ungefähr sein könnte - Das neue Date ...2014.java-forum-stuttgart.de/_data/D3_2014.pdf · aformatik Training & Consulting GmbH & Co. KG 8 JSR 310 - Überblick

18.07.2014

6

aformatik Training & Consulting GmbH & Co. KG 11

JSR 310 - Überblick (4)

java.time.temporal

java.time.chrono

java.time

2.

Zeitskalen

Page 7: Wissen wie spät es ungefähr sein könnte - Das neue Date ...2014.java-forum-stuttgart.de/_data/D3_2014.pdf · aformatik Training & Consulting GmbH & Co. KG 8 JSR 310 - Überblick

18.07.2014

7

aformatik Training & Consulting GmbH & Co. KG 13

Zeitskalen - Maschinelle Zeitskala (1)

Instant: ein Zeitpunkt gemessen in Nanosekunden seit Anfang der Epoche (1.1.1970)

Duration: die Dauer einer Zeitspanne, ohne Bezug auf konkrete Zeitpunkte

Instant (Start) Instant (Ende)

Duration

java.time

aformatik Training & Consulting GmbH & Co. KG 14

Zeitskalen - Maschinelle Zeitskala (2)

unveränderbare Instanzen (immutable); stattdessen neue Objekte

Mathematische Operationen

Instant startSchuss = Instant.ofEpochMilli(123456789L);

//Lola rennt

Instant lolaFinish = Instant.now();

//Forest läuft noch

Instant forestFinish = Instant.now();

Duration laufzeit1 = Duration.between(startSchuss, lolaFinish);

Duration laufzeit2 = Duration.between(startSchuss, forestFinish);

Duration teamDurchschnitt = laufzeit1.plus(laufzeit2).dividedBy(2);

java.time

Page 8: Wissen wie spät es ungefähr sein könnte - Das neue Date ...2014.java-forum-stuttgart.de/_data/D3_2014.pdf · aformatik Training & Consulting GmbH & Co. KG 8 JSR 310 - Überblick

18.07.2014

8

aformatik Training & Consulting GmbH & Co. KG 15

Zeitskalen - Menschliche Zeitskala (1)

Feld-basierte Repräsentation (Jahr, Monat, Tag, Stunde, etc.)

Feldwerte als nummerische Literale (int oder long)

immutable

basiert auf ISO-8601

vier Grundklassen

LocalDate

LocalTime

ZoneOffset

ZoneId

mehrere zusammengesetzte Klassen

Perioden

java.time

aformatik Training & Consulting GmbH & Co. KG 16

Zeitskalen - Menschliche Zeitskala (2)

LocalDate LocalTime ZoneOffset ZoneId

LocalDateTime + + - -

OffsetTime - + + -

OffsetDateTime + + + -

ZonedDateTime + + + +

java.time

Zusammengesetzte Klassen

Page 9: Wissen wie spät es ungefähr sein könnte - Das neue Date ...2014.java-forum-stuttgart.de/_data/D3_2014.pdf · aformatik Training & Consulting GmbH & Co. KG 8 JSR 310 - Überblick

18.07.2014

9

aformatik Training & Consulting GmbH & Co. KG 17

Zeitskalen - Menschliche Zeitskala (3)

Year Month Day

(LocalDate) + + +

YearMonth + + -

MonthDay - + +

Year + - -

Zusammengesetzte Klassen

java.time

aformatik Training & Consulting GmbH & Co. KG 18

Zeitskalen - Menschliche Zeitskala (4)

LocalDateTime ldt = LocalDateTime.of(2014, 7, 17, 11, 30);

ZoneOffset offset = ZoneOffset.ofHours(+1);

Set<String> allZones = ZoneId.getAvailableZoneIds();

ZoneId berlinTZ = ZoneId.of("Europe/Berlin");

OffsetDateTime odt = OffsetDateTime.of(ldt, offset);

ZonedDateTime berlinZDT = ZonedDateTime.of(ldt, berlinTZ);

System.out.println("Sekunden-Unterschied: " +

Duration.between(berlinZDT, odt).getSeconds());

// Sekunden-Unterschied: 3600

ZoneOffset vs ZoneId

java.time

Page 10: Wissen wie spät es ungefähr sein könnte - Das neue Date ...2014.java-forum-stuttgart.de/_data/D3_2014.pdf · aformatik Training & Consulting GmbH & Co. KG 8 JSR 310 - Überblick

18.07.2014

10

aformatik Training & Consulting GmbH & Co. KG 19

Zeitskalen - Interaktion

//aus der alten Welt

java.util.Date badOldDate = new java.util.Date();

Instant inst = badOldDate.toInstant();

badOldDate = java.util.Date.from(Instant.now());

//maschinelle Skala -> menschliche Skala

ZoneId zeitzone = ZoneId.of("Europe/Berlin");

ZonedDateTime zdt = ZonedDateTime.ofInstant(inst, zeitzone);

//und umgekehrt

Instant newInst = zdt.toInstant();

java.time

3.

Verwendung

Page 11: Wissen wie spät es ungefähr sein könnte - Das neue Date ...2014.java-forum-stuttgart.de/_data/D3_2014.pdf · aformatik Training & Consulting GmbH & Co. KG 8 JSR 310 - Überblick

18.07.2014

11

aformatik Training & Consulting GmbH & Co. KG 21

Allgemeine Methoden (1)

Prefix Typ Anwendung

of statische Factory Erstellung einer Instanz ohne Konvertierung der Eingabeparameter

from statische Factory Erstellung einer Instanz aus der Eingabe mit evtl. Informationsverlust

parse statische Factory Erstellung einer Instanz durch das Parsen einer Zeichenkette

format instanz Formatierung anhand des übergebenen Formatters

with instanz Liefert eine veränderte Kopie des Objects (ersetzt die Setter-Methoden)

plus instanz Liefert eine Kopie des Objects erhöht um die angegebene Zeitmenge

to instanz Konvertierung zu einem anderen Typ

at instanz Kombination mit einem anderen Object, um ein neues zu erstellen

aformatik Training & Consulting GmbH & Co. KG 22

Allgemeine Methoden (2)

LocalDate jfs2009 = LocalDate.of(2009, 7, 2);

LocalDate jfs2014 = jfs2009.plusYears(5).withDayOfMonth(17);

OffsetDateTime odt = OffsetDateTime.parse("2014-07-17T11:10:00+02:00");

LocalTime time = LocalTime.from(odt);

LocalDateTime jsr310DateTime = jfs2014.atTime(time);

System.out.println("JSR310 Termin: " +

jsr310DateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));

// JSR310 Termin: 2014-07-17T11:10:00

Page 12: Wissen wie spät es ungefähr sein könnte - Das neue Date ...2014.java-forum-stuttgart.de/_data/D3_2014.pdf · aformatik Training & Consulting GmbH & Co. KG 8 JSR 310 - Überblick

18.07.2014

12

aformatik Training & Consulting GmbH & Co. KG 23

Felderzugriff

typisierter Felderzugriff

TemporalField / ChronoField

TemporalUnit / ChronoUnit

ValueRange

jede Date/Time Klasse unterstützt bestimmte FelderTypen

typisierte Felder

Month (enum)

DayOfWeek (enum)

long secondsFromEpoch = Instant.EPOCH.until(Instant.now(), ChronoUnit.SECONDS);

Instant.now().isSupported(ChronoField.MONTH_OF_YEAR); // true

ChronoField.MONTH_OF_YEAR.range(); // 1 - 12

ChronoField.DAY_OF_MONTH.range().getSmallestMaximum(); // 28

MonthDay geburtstag = MonthDay.of(Month.JANUARY, 1);

java.time.temporal

aformatik Training & Consulting GmbH & Co. KG 24

Allgemeine Interfaces

TemporalAccessor

get(TemporalField) : int (oder getLong(TemporalField) : long)

isSupported(TemporalField) : boolean

range(TemporalField) : ValueRange

query(TemporalQuery<R>) : R

Temporal (Instant, LocalDate, ZonedDateTime, …)

plus/minus(TemporalAmount) : Temporal

plus/minus(long, TemporalUnit) : Temporal

with(TemporalField, long) : Temporal

with(TemporalAdjuster) : Temporal

isSupported(TemporalUnit) : boolean

until(Temporal, TemporalUnit) : long

TemporalAmount (Duration, Period)

addTo, subtractFrom, get(TemporalUnit), getUnits()

java.time.temporal

Page 13: Wissen wie spät es ungefähr sein könnte - Das neue Date ...2014.java-forum-stuttgart.de/_data/D3_2014.pdf · aformatik Training & Consulting GmbH & Co. KG 8 JSR 310 - Überblick

18.07.2014

13

4.

Diverses

aformatik Training & Consulting GmbH & Co. KG 26

Adjusters (1)

Veränderung von Daten/Zeiten

Interface: TemporalAdjuster

Factory: TemporalAdjusters

public interface TemporalAdjuster {

Temporal adjustInto(Temporal temporal);

}

java.time.temporal

Page 14: Wissen wie spät es ungefähr sein könnte - Das neue Date ...2014.java-forum-stuttgart.de/_data/D3_2014.pdf · aformatik Training & Consulting GmbH & Co. KG 8 JSR 310 - Überblick

18.07.2014

14

aformatik Training & Consulting GmbH & Co. KG 27

Adjusters (2) java.time.temporal

LocalDate jfs2014 = LocalDate.of(2014, 7, 17);

LocalDate jfs2015 = jfs2014.plus(Period.ofYears(1))

.with(TemporalAdjusters.firstInMonth(DayOfWeek.THURSDAY));

// 2015-07-02

//Alternativ

LocalDate jfs2015 = LocalDate.from(

TemporalAdjusters.firstInMonth(DayOfWeek.THURSDAY)

.adjustInto(jfs2014.plus(Period.ofYears(1))));

Verwendung über

Temporal (empfohlen): Temporal with(TemporalAdjuster)

TemporalAdjuster: Temporal adjustInto(Temporal)

aformatik Training & Consulting GmbH & Co. KG 28

Adjusters (3)

TemporalAdjuster quartalsEnde = new TemporalAdjuster()

{

public Temporal adjustInto(Temporal temporal) {

int monat = temporal.get(ChronoField.MONTH_OF_YEAR);

int quartalsendeMonat = ((monat-1)/3 + 1)*3;

return temporal.with(ChronoField.MONTH_OF_YEAR, quartalsendeMonat)

.with(TemporalAdjusters.lastDayOfMonth());

}

};

System.out.println("Quartalsende: " + LocalDate.of(2014, 7,

17).with(quartalsEnde));

// Quartalsende: 2014-09-30

java.time.temporal

Page 15: Wissen wie spät es ungefähr sein könnte - Das neue Date ...2014.java-forum-stuttgart.de/_data/D3_2014.pdf · aformatik Training & Consulting GmbH & Co. KG 8 JSR 310 - Überblick

18.07.2014

15

aformatik Training & Consulting GmbH & Co. KG 29

Queries

Überprüfung eines Datums / einer Zeit nach beliebigen Kriterien

Interface: TemporalQuery

Factory: TemporalQueries

public interface TemporalQuery<R> {

R queryFrom(TemporalAccessor temporal);

}

System.out.println(LocalDate.now().query(TemporalQueries.precision()));

Days

//Alternativ

System.out.println(TemporalQueries.chronology().queryFrom(ZonedDateTime.now()));

ISO

java.time.temporal

aformatik Training & Consulting GmbH & Co. KG 30

Integration

Interfaces für die Integration der alten Klassen oder von alternativen Kalender-

Systemen

Temporal (Temporal Accessor)

TemporalAdjuster

Mapping der bestehenden Klassen

java.util.Date Instant

java.util.GregorianCalendar ZonedDateTime

java.sql.Date LocalDate

java.sql.Time LocalTime

java.sql.Timestamp LocalDateTime

alternative Kalender (java.time.chrono.Chronology)

alternative Zeit-Quellen (java.time.Clock)

Page 16: Wissen wie spät es ungefähr sein könnte - Das neue Date ...2014.java-forum-stuttgart.de/_data/D3_2014.pdf · aformatik Training & Consulting GmbH & Co. KG 8 JSR 310 - Überblick

18.07.2014

16

aformatik Training & Consulting GmbH & Co. KG 31

Gefahrenherde

gemeinsame Interfaces für unterschiedliche Zeitskalen und Konzepte

Duration und Period implementieren beide TemporalAmount

die Klassen von beiden Zeitskalen implementieren Temporal

Überprüfung der unterstützten Feldern

Period.from(Duration.of(3, ChronoUnit.DAYS));

Exception in thread "main" java.time.DateTimeException:

Unit must be Years, Months or Days, but was Seconds

at java.time.Period.from(Period.java:282)

Verwendung der allgemeinen Interfaces bei der Integration unterschiedlicher

Chronologien.

am besten ISO-Chronology durchgehend

Umwandlung in anderen Chronologien bei Bedarf

aformatik Training & Consulting GmbH & Co. KG 32

Zusammenfassung

zwei Zeitskalen

immutable Instanzen und Erzeugung über Factories

Interfaces für Integration und Erweiterbarkeit

u.a. bleibt das alte API bestehen und wird nicht als "deprecated" markiert

ausführliche Javadoc und konsistente sprechende Methoden

intuitiver

Page 17: Wissen wie spät es ungefähr sein könnte - Das neue Date ...2014.java-forum-stuttgart.de/_data/D3_2014.pdf · aformatik Training & Consulting GmbH & Co. KG 8 JSR 310 - Überblick

18.07.2014

17

aformatik Training & Consulting GmbH & Co. KG 33

Wissen, wie spät es ungefähr sein könnte

Das neue Date/Time API von JDK 8

aformatik Training & Consulting GmbH & Co. KG 34

Noch mehr Wissen...

Wissen, wann und wo der nächste Vortrag statt findet:

die neue JFS App

Wissen, wo man weitere Fragen stellen kann:

aformatik Stand Nr.5 im Foyer vor dem Hegel Saal

Wissen, wie man aus Sicherheitsdistanz Fragen stellen kann:

[email protected]

Homepage: http://www.aformatik.de