Ab Java 8 bietet das Paket java.time eine neue Datums- und Uhrzeit-API. Die neue API unterscheidet strikt zwischen Uhrzeit, Ortsdatum und Ortszeit und erleichtert die Durchführung von Datums- und Uhrzeitberechnungen. Die wichtigsten beteiligten Typen sind die folgenden:
LocalDate: Ein Datum, das keine bestimmte Uhrzeit enthält.
LocalTime: Uhrzeit ohne Datum.
LocalDateTime: Enthält Datum und Uhrzeit.
Instant: Stellt einen Zeitstempel dar.
DateTimeFormatter wird zur Zeitformatierung und -analyse verwendet
Dauer: Wird zur Berechnung von zwei „Zeit“-Intervallen verwendet
Zeitraum: Wird zur Berechnung des Intervalls zwischen zwei „Daten“ verwendet.
Die Typen der neuen API sind fast alle invariante Typen (ähnlich der Verwendung von String), die bedenkenlos verwendet werden können, ohne sich Gedanken über Änderungen machen zu müssen. Unter diesen stellen LocalDate, LocalTime und LocalDateTime Datums-, Uhrzeit- und Datum-Uhrzeit-Objekte dar, und Instanzen ihrer Klassen sind unveränderliche Objekte. Alle drei erstellen gemeinsame Objekte und APIs.
Die Art und Weise, das Objekt zu konstruieren, ist wie folgt:
API zum Abrufen von Informationen zu LocalDate, LocalTime und LocalDateTime.
Ändern Sie zugehörige APIs
LocalDateTime kombiniert die Methoden von LocalDate und LocalTime, daher werden im Folgenden nur LocalDate und LocalTime als Beispiele verwendet. Diese Methoden geben einen neuen Instanzverweis zurück, da LocalDateTime, LocalDate und LocalTime unveränderlich sind.
Sofortiger Zeitstempel
JDK8 ist besonders einfach zum Abrufen von Zeitstempeln und verfügt über mehr Funktionen. Die Instant-Klasse verfügt über eine statische Factory-Methode now(), die den aktuellen Zeitstempel zurückgibt.
Instant instant = Instant.now();
System.out.println("当前时间戳是:" + instant);
Date date = Date.from(instant);
System.out.println("当前时间戳是:" + date);
instant = date.toInstant();
System.out.println(instant);
Timestamp enthält Datum und Uhrzeit, was java.util.Date sehr ähnlich ist. Tatsächlich ähnelt Instant dem Date vor JDK8. Die beiden Klassen Instant und Date können konvertiert werden.
DateTimeFormatter
In JDK8 wurde ein neuer Datums- und Zeitformatierer DateTimeFormatter eingeführt. Die Formatmethode kann sowohl positiv als auch negativ genannt werden.
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);//2021-03-01T15:09:17.444190900
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String ldtStr = ldt.format(dtf);
System.out.println(ldtStr);//2021-03-01 15:09:17
String ldtStr1 = dtf.format(ldt);
System.out.println(ldtStr1);//2021-03-01 15:09:17
Zeitraum
In Java8 können wir die folgende Klasse verwenden, um die Datumsintervalldifferenz zu berechnen: java.time.Period. Sie wird hauptsächlich durch die Methoden getYears(), getMonths() und getDays() der Period-Klasse berechnet, die nur auf Jahr, Monat und Tag genau sein können. Wird zum Vergleich zwischen LocalDate verwendet.
LocalDate today = LocalDate.now();
System.out.println(today); // 2021-03-01
LocalDate birthDate = LocalDate.of(1995, 1, 11);
System.out.println(birthDate); // 1995-01-11
Period period = Period.between(birthDate, today);
System.out.printf("年龄 : %d 年 %d 月 %d 日", period.getYears(), period.getMonths(),
period.getDays());
Dauer
In Java8 können wir die folgenden Klassen verwenden, um Zeitintervallunterschiede zu berechnen: java.time.Duration, zeitbasierte Werte, Methoden zur Messung der Zeitdauer. Wird für Vergleiche zwischen LocalDateTimes verwendet. Es kann auch zum Vergleich zwischen Instants verwendet werden.
LocalDateTime today = LocalDateTime.now();
System.out.println(today);
LocalDateTime birthDate = LocalDateTime.of(1990,10,1,10,50,30);
System.out.println(birthDate);
Duration duration = Duration.between(birthDate, today);//第二个参数减第一个参数
System.out.println(duration.toDays());//两个时间差的天数
System.out.println(duration.toHours());//两个时间差的小时数
System.out.println(duration.toMinutes());//两个时间差的分钟数
System.out.println(duration.toMillis());//两个时间差的毫秒数
System.out.println(duration.toNanos());//两个时间差的纳秒数
Die Dauer wird verwendet, um zwei „Zeit“-Intervalle zu berechnen. Mit der Periode wird das Intervall zwischen zwei „Daten“ berechnet.
Java.time.temporal.ChronoUnit
Mit der Klasse ChronoUnit kann ein Zeitraum in einer einzelnen Zeiteinheit gemessen werden. Diese Werkzeugklasse ist die umfassendste und kann zum Vergleich aller Zeiteinheiten verwendet werden.
LocalDateTime today = LocalDateTime.now();
System.out.println(today);
LocalDateTime birthDate = LocalDateTime.of(1990,10,1,10,50,30);
System.out.println(birthDate);
System.out.println("相差的年数:" + ChronoUnit.YEARS.between(birthDate, today));
System.out.println("相差的月数:" + ChronoUnit.MONTHS.between(birthDate, today));
System.out.println("相差的周数:" + ChronoUnit.WEEKS.between(birthDate, today));
System.out.println("相差的天数:" + ChronoUnit.DAYS.between(birthDate, today));
System.out.println("相差的时数:" + ChronoUnit.HOURS.between(birthDate, today));
System.out.println("相差的分数:" + ChronoUnit.MINUTES.between(birthDate, today));
System.out.println("相差的秒数:" + ChronoUnit.SECONDS.between(birthDate, today));
System.out.println("相差的毫秒数:" + ChronoUnit.MILLIS.between(birthDate, today));
System.out.println("相差的微秒数:" + ChronoUnit.MICROS.between(birthDate, today));
System.out.println("相差的纳秒数:" + ChronoUnit.NANOS.between(birthDate, today));
System.out.println("相差的半天数:" + ChronoUnit.HALF_DAYS.between(birthDate, today));
System.out.println("相差的十年数:" + ChronoUnit.DECADES.between(birthDate, today));
System.out.println("相差的世纪(百年)数:" + ChronoUnit.CENTURIES.between(birthDate, today));
System.out.println("相差的千年数:" + ChronoUnit.MILLENNIA.between(birthDate, today));
System.out.println("相差的纪元数:" + ChronoUnit.ERAS.between(birthDate, today));