Java 8 Date Time API - Beispiele


Die mit JavaSE 8 eingeführte Date-Time-API ersetzt die Verwendung der alten java.util.Date und java.util.Calendar Klassen und bietet viele komfortable Möglichkeiten zur Zeit-Behandlung. Die folgenden Programmzeilen geben einen kurzen Überblick über die Möglichkeiten der API und deren Verwendung. Alle Klassen sind im java.time-package enthalten.

LocalDate, LocalTime, LocalDateTime


// das aktuelle Datum
LocalDate currentDate = LocalDate.now();
 
// 2016-07-05
LocalDate tenthFeb2016 = LocalDate.of(2016, Month.JULY, 5);
 
// 2016-07-05
LocalDate firstAug2016 = LocalDate.of(2016, 7, 5);
 
// der 65. Tag von 2016 (2016-03-06)
LocalDate sixtyFifthDayOf2016 = LocalDate.ofYearDay(2016, 65);

// aktuelle Uhrzeit
LocalTime currentTime = LocalTime.now(); 

// 12:00 Uhr
LocalTime midday = LocalTime.of(12, 0);

// 14:30:15
LocalTime afterMidday = LocalTime.of(14, 30, 15); 
 
// 12345. Sekunde des Tages (03:25:45)
LocalTime fromSecondsOfDay = LocalTime.ofSecondOfDay(12345);
 
// Datum mit Zeit, z.B. 2016-05-15 20:15:23.340
LocalDateTime currentDateTime = LocalDateTime.now();
 
// 2016-11-05 13:45
LocalDateTime secondAug2016 = LocalDateTime.of(2016, 11, 5, 13, 45);
 
// 2016-12-24 12:00
LocalDateTime christmas2016 = LocalDateTime.of(2016, Month.DECEMBER, 24, 12, 0);


LocalDate/Time verwendet standardmäßig die auf dem Server eingestellte Zeitzone. Diese kann natürlich geändert werden:

// aktuelle lokale Zeit in Los Angeles
LocalTime currentTimeInLosAngeles = LocalTime.now(ZoneId.of("America/Los_Angeles"));
 
// aktuelle Zeit in der UTC Zeitzone
LocalTime nowInUtc = LocalTime.now(Clock.systemUTC());

Weitere Anwendungsmöglichkeiten


LocalDate date = LocalDate.of(2016, 2, 15); // 2016-02-15
 
boolean isBefore = LocalDate.now().isBefore(date); // false
 
// Informationen ueber den Monat
Month february = date.getMonth(); // FEBRUARY
int februaryIntValue = february.getValue(); // 2
int minLength = february.minLength(); // 28
int maxLength = february.maxLength(); // 29
Month firstMonthOfQuarter = february.firstMonthOfQuarter(); // JANUARY
 
// Informationen ueber das Jahr
int year = date.getYear(); // 2016
int dayOfYear = date.getDayOfYear(); // 46
int lengthOfYear = date.lengthOfYear(); // 365
boolean isLeapYear = date.isLeapYear(); // false
 
DayOfWeek dayOfWeek = date.getDayOfWeek();
int dayOfWeekIntValue = dayOfWeek.getValue(); // 6
String dayOfWeekName = dayOfWeek.name(); // SATURDAY
 
int dayOfMonth = date.getDayOfMonth(); // 15
LocalDateTime startOfDay = date.atStartOfDay(); // 2016-02-15 00:00
 
// time information
LocalTime time = LocalTime.of(15, 30); // 15:30:00
int hour = time.getHour(); // 15
int second = time.getSecond(); // 0
int minute = time.getMinute(); // 30
int secondOfDay = time.toSecondOfDay(); // 55800

Year currentYear = Year.now();
Year twoThousand = Year.of(2000);
boolean isLeap = currentYear.isLeap(); // false
int length = currentYear.length(); // 365
 
// 64. Tag von 2016 (2016-03-05)
LocalDate date = Year.of(2016).atDay(64);

Mit den plus- und minus-Methoden können leicht Datumswerte verändert werden. Dabei wird immer eine neue Instanz zurückgeliefert.

LocalDate tomorrow = LocalDate.now().plusDays(1);
 
// vor 5 Stunden und 30 Minuten
LocalDateTime dateTime = LocalDateTime.now().minusHours(5).minusMinutes(30);

TemporalAdjusters ist ein anderer Weg der Datums-Manipulation.

import static java.time.temporal.TemporalAdjusters.*;
 
// der letzte Tage von 2016 (2016-12-31)
LocalDate lastDayOfYear = date.with(lastDayOfYear());
 
// Der erste Tag des nächsten Monats (2016-03-01)
LocalDate firstDayOfNextMonth = date.with(firstDayOfNextMonth());
 
// naechsten Sonntag (2016-03-02)
LocalDate nextSunday = date.with(next(DayOfWeek.SUNDAY));
LocalDate date = LocalDate.of(2016, Month.FEBRUARY, 25); // 2016-02-25
 
// erster Tag von Februar 2016 (2016-02-01)
LocalDate firstDayOfMonth = date.with(TemporalAdjusters.firstDayOfMonth());
 
// letzter Tag von Februar 2016 (2016-02-28)
LocalDate lastDayOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());

Zeitzonen


ZoneId losAngeles = ZoneId.of("America/Los_Angeles");
ZoneId berlin = ZoneId.of("Europe/Berlin");
 
// 2016-02-20 12:00
LocalDateTime dateTime = LocalDateTime.of(2016, 02, 20, 12, 0);
 
// 2016-02-20 12:00, Europe/Berlin (+01:00)
ZonedDateTime berlinDateTime = ZonedDateTime.of(dateTime, berlin);
 
// 2016-02-20 03:00, America/Los_Angeles (-08:00)
ZonedDateTime losAngelesDateTime = berlinDateTime.withZoneSameInstant(losAngeles);
 
int offsetInSeconds = losAngelesDateTime.getOffset().getTotalSeconds(); // -28800
 
// Collection der verfuegbaren Zeitzonen
Set allZoneIds = ZoneId.getAvailableZoneIds();
 
// Verwendung von Offsets
LocalDateTime date = LocalDateTime.of(2013, Month.JULY, 20, 3, 30);
ZoneOffset offset = ZoneOffset.of("+05:00");
 
// 2013-07-20 03:30 +05:00
OffsetDateTime plusFive = OffsetDateTime.of(date, offset);
 
// 2013-07-19 20:30 -02:00
OffsetDateTime minusTwo = plusFive.withOffsetSameInstant(ZoneOffset.ofHours(-2));

Timestamps


Oft ist die Nutzung von Timestamps gewünscht anstatt von LocalDate-Objekten. Gerade beim Speichern von Zeitwerten in Datenbanken besteht häufig die Anforderung oder bei der Konvertierung von alten Date-Objekten zu LocalDate-Objekten und umgekehrt. Dafür gibt es die Klasse Instant. Diese enthält den Zeitwert, der seit dem 1. Januar 1970 um 00:00:00 vergangen ist. Man spricht in diesem Zusammenhang auch von einer Epoche. Negative Werte im Instant-Objekt beziehen sich auf Epochen davor. Die Zeitdarstellung erfolgt nach ISO 8601.

// aktuelle Zeit
Instant now = Instant.now();
 
// unix timestamp, 2016-01-01 12:00:00
Instant fromUnixTimestamp = Instant.ofEpochSecond(1262347200);
 
// Zeit in Millisekunden
Instant fromEpochMilli = Instant.ofEpochMilli(1262347200000l);
 
// parsing von ISO 8601
Instant fromIso8601 = Instant.parse("2016-01-01T12:00:00Z");
 
// toString() liefert die Zeitangabe im ISO 8601 format zurueck, z.B. 2016-02-15T01:02:03Z
String toIso8601 = now.toString();
 
// als unix timestamp
long toUnixTimestamp = now.getEpochSecond();
 
// in Millisekunden
long toEpochMillis = now.toEpochMilli();
 
// plus/minus methods are available too
Instant nowPlusTenSeconds = now.plusSeconds(10);

Periods und Durations


Perioden basieren auf den Datumswerten Tag, Monat und Jahr und beschreiben einen Zeitabschnitt. Durations basieren auf Minuten, Sekunden und Nanosekunden und definieren eine bestimmte Dauer.

// periods
LocalDate firstDate = LocalDate.of(2016, 5, 17); // 2016-05-17
LocalDate secondDate = LocalDate.of(2015, 3, 7); // 2015-03-07
Period period = Period.between(firstDate, secondDate);
 
int days = period.getDays(); // 18
int months = period.getMonths(); // 9
int years = period.getYears(); // 4
boolean isNegative = period.isNegative(); // false
 
Period twoMonthsAndFiveDays = Period.ofMonths(2).plusDays(5);
LocalDate sixthOfJanuary = LocalDate.of(2016, 1, 6);
 
// addiere 2 Monate und fuenf Tage zu 2016-01-06 -> 2016-03-11
LocalDate eleventhOfMarch = sixthOfJanuary.plus(twoMonthsAndFiveDays);
 
// durations
Instant firstInstant= Instant.ofEpochSecond( 1294881180 ); // 2011-01-13 01:13
Instant secondInstant = Instant.ofEpochSecond(1294708260); // 2011-01-11 01:11
 
Duration between = Duration.between(firstInstant, secondInstant);
 
// enthaelt negativen Wert, da firstInstant nach secondInstant liegt (-172920)
long seconds = between.getSeconds();
 
// liefert das Ergebnis in Minuten (2882)
long absoluteResult = between.abs().toMinutes();
 
// zwei Stunden in Sekunden (7200)
long twoHoursInSeconds = Duration.ofHours(2).getSeconds();

Formatting and parsing


Formatierung und Parsen sind zwei wichtige Anwendungen im Bereich der Konvertierung. Beispielsweise sollen Formulareingaben eines Benutzers, die als String Wert an den Server gesendet werden, in einem LocalDateTime-Objekt abgelegt werden. Oder der Datumswert in LocalDate soll im europäischen Format dem Benutzer angezeigt werden.

// 2016-04-01 10:45
LocalDateTime dateTime = LocalDateTime.of(2016, Month.APRIL, 1, 10, 45);
 
// format als basic ISO date format (20160220)
String asBasicIsoDate = dateTime.format(DateTimeFormatter.BASIC_ISO_DATE);
 
// format als ISO week date (2016-W08-4)
String asIsoWeekDate = dateTime.format(DateTimeFormatter.ISO_WEEK_DATE);
 
// format als ISO date time (2016-02-20T20:04:05.867)
String asIsoDateTime = dateTime.format(DateTimeFormatter.ISO_DATE_TIME);
 
// eigenes Datumspattern verwenden (01/04/2016)
String asCustomPattern = dateTime.format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));
 
// deutsches date format (1.4.2016)
String germanDate = dateTime.format(DateTimeFormatter.ofPattern("dd.MM.yyyy", new Locale("de")));
 
// deutsches date/time Format (01.04.16 10:45)
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT)
    .withLocale(new Locale("de"));
String germanDateTime = dateTime.format(formatter);
 
// parsing date strings
LocalDate fromIsoDate = LocalDate.parse("2016-01-20");
LocalDate fromIsoWeekDate = LocalDate.parse("2016-W14-2", DateTimeFormatter.ISO_WEEK_DATE);
LocalDate fromCustomPattern = LocalDate.parse("20.01.2016", DateTimeFormatter.ofPattern("dd.MM.yyyy"));

Konvertierungen zwischen den Date-/Time-Objekten


// LocalDate/LocalTime <-> LocalDateTime
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTimeFromDateAndTime = LocalDateTime.of(date, time);
LocalDate dateFromDateTime = LocalDateTime.now().toLocalDate();
LocalTime timeFromDateTime = LocalDateTime.now().toLocalTime();
 
// Instant <-> LocalDateTime
Instant instant = Instant.now();
LocalDateTime dateTimeFromInstant = LocalDateTime.ofInstant(instant, ZoneId.of("America/Los_Angeles"));
Instant instantFromDateTime = LocalDateTime.now().toInstant(ZoneOffset.ofHours(-2));
 
// convert old date/calendar/timezone classes
Instant instantFromDate = new Date().toInstant();
Instant instantFromCalendar = Calendar.getInstance().toInstant();
ZoneId zoneId = TimeZone.getDefault().toZoneId();
ZonedDateTime zonedDateTimeFromGregorianCalendar = new GregorianCalendar().toZonedDateTime();
 
// convert to old classes
Date dateFromInstant = Date.from(Instant.now());
TimeZone timeZone = TimeZone.getTimeZone(ZoneId.of("America/Los_Angeles"));
GregorianCalendar gregorianCalendar = GregorianCalendar.from(ZonedDateTime.now());

Tags: LocalDate, LocalDateTime, LocalTime, TimeZone, API
Guido Oelmann     Montag, 8. August 2016 0    3552
@
(Email Adresse wird nicht veröffentlicht)
(kein HTML erlaubt)
Bitte beantworten Sie die einfache mathematische Frage.
  


Keine Kommentare vorhanden.