Java Duration-Klasse
Die Duration-Klasse ist eine wichtige Klasse im Datums-/Zeit-API (java.time-Paket), das in Java 8 eingeführt wurde, und wird verwendet, um Zeitintervalle oder Zeitdauern darzustellen.
Die Duration-Klasse wird hauptsächlich verwendet, um die Differenz zwischen zwei Zeitpunkten zu berechnen oder eine bestimmte Zeitspanne darzustellen.
Grundlegende Konzepte
Das von der Duration-Klasse dargestellte Zeitintervall kann auf Nanosekunden genau sein. Es wird hauptsächlich verwendet, um zeitbasierte Größen (Stunden, Minuten, Sekunden und Nanosekunden) zu verarbeiten, ohne die Konzepte von Datum oder Zeitzone einzubeziehen.
Hauptfunktionen:
- Unveränderlichkeit - Sobald ein Duration-Objekt erstellt wurde, kann es nicht geändert werden
- Thread-Sicherheit - Kann sicher in Multithread-Umgebungen verwendet werden
- Hohe Präzision - Kann auf Nanosekunden genau sein
- Verkettete Aufrufe - Unterstützt Methodenverkettung
Duration-Objekte erstellen
Die Duration-Klasse bietet mehrere statische Methoden zum Erstellen von Duration-Instanzen:
1. Erstellen über Zeiteinheiten
Beispiel
Duration twoHours = Duration.ofHours(2);
// Erstelle eine Duration, die 30 Minuten dauert
Duration thirtyMinutes = Duration.ofMinutes(30);
// Erstelle eine Duration, die 45 Sekunden dauert
Duration fortyFiveSeconds = Duration.ofSeconds(45);
// Erstelle eine Duration, die 500 Millisekunden dauert
Duration fiveHundredMillis = Duration.ofMillis(500);
// Erstelle eine Duration, die 1,000,000 Nanosekunden dauert
Duration oneMillionNanos = Duration.ofNanos(1_000_000);
2. Erstellen über Zeitmenge
Beispiel
Duration customDuration = Duration.ofDays(1).plusHours(2).plusMinutes(3);
3. Berechnung anhand von zwei Zeitpunkten
Beispiel
// Einige Operationen ausführen...
Instant end = Instant.now();
Duration elapsed = Duration.between(start, end);
4. Erstellen durch Parsen einer Zeichenkette
Beispiel
Duration parsedDuration = Duration.parse("PT2H30M15S"); // 2 Stunden, 30 Minuten, 15 Sekunden
Häufige Methoden
Die Klasse Duration bietet umfangreiche Methoden zum Umgang mit Zeitintervallen:
1. Abrufen von Zeitwerten
Beispiel
long hours = duration.toHours(); // 2
long minutes = duration.toMinutes(); // 150
long seconds = duration.getSeconds(); // 9000
int nanos = duration.getNano(); // 0
2. Zeitoperationen
Beispiel
Duration d2 = Duration.ofMinutes(30);
// Addition
Duration sum = d1.plus(d2); // 2 Stunden 30 Minuten
// Subtraktion
Duration diff = d1.minus(d2); // 1 Stunde 30 Minuten
// Multiplikation
Duration multipliziert = d1.multipliedBy(3); // 6 hours
// Division
Duration geteilt = d1.dividedBy(2); // 1 hour
3. Vergleichsoperationen
Beispiel
Duration d2 = Duration.ofMinutes(90);
boolean isEqual = d1.equals(d2); // false
int comparison = d1.compareTo(d2); // -1 (d1 < d2)
boolean isNegative = d1.isNegative(); // false
boolean isZero = d1.isZero(); // false
4. Weitere praktische Methoden
Beispiel
// In andere Einheiten umrechnen
long hours = duration.toHours(); // 1
long minutes = duration.toMinutes(); // 90
long seconds = duration.toSeconds(); // 5400
long millis = duration.toMillis(); // 5400000
long nanos = duration.toNanos(); // 5400000000000
// Jeden Teil abrufen
long secondsPart = duration.getSeconds(); // 5400
int nanoPart = duration.getNano(); // 0
// Absoluten Wert abrufen
Duration absDuration = duration.abs();
// Negativen Wert abrufen
Duration negated = duration.negated();
Praktische Anwendungsbeispiele
Beispiel 1: Berechnung der Codeausführungszeit
Beispiel
// Simuliere eine zeitaufwändige Operation
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
Instant end = Instant.now();
Duration elapsed = Duration.between(start, end);
System.out.println("Code-Ausführungszeit: " + elapsed.toMillis() + " Millisekunden");
Beispiel 2: Zeitformatkonvertierung
Beispiel
// In das Format "HH:MM:SS" umwandeln
long hours = duration.toHours();
long minutes = duration.minusHours(hours).toMinutes();
long seconds = duration.minusHours(hours).minusMinutes(minutes).getSeconds();
String formatted = String.format("%02d:%02d:%02d", hours, minutes, seconds);
System.out.println(formatted); // Ausgabe: 02:15:00
Beispiel 3: Timeout-Steuerung
Beispiel
Instant startTime = Instant.now();
while (true) {
// Prüfen, ob eine Zeitüberschreitung aufgetreten ist
if (Duration.between(startTime, Instant.now()).compareTo(timeout) > 0) {
System.out.println("Zeitüberschreitung bei der Operation");
break;
}
// Weitere Operationen ausführen...
}
Beispiel
import java.time.LocalTime;
import java.time.Instant;
public class DurationDemo {
public static void main(String[] args) {
// Verschiedene Möglichkeiten, Duration-Objekte zu erstellen
// 1. Verwenden Sie die of...()-Methode
Duration duration1 = Duration.ofHours(2); // 2 Stunden
Duration duration2 = Duration.ofMinutes(90); // 90 Minuten
System.out.println("Dauer 1: " + duration1);
System.out.println("Dauer 2: " + duration2);
// 2. Verwenden Sie die between()-Methode, um die Dauer zwischen zwei Zeitpunkten zu berechnen
LocalTime startTime = LocalTime.of(9, 0);
LocalTime endTime = LocalTime.of(11, 30);
Duration duration3 = Duration.between(startTime, endTime);
System.out.println("Dauer zwischen den Zeiten: " + duration3);
// 3. Verwenden Sie die parse()-Methode, um eine Dauer aus einer Zeichenkette zu erstellen
Duration duration4 = Duration.parse("PT2H30M"); // ISO-8601-Format
System.out.println("Geparste Dauer: " + duration4);
// 4. Verwenden Sie Instant, um die Zeitdifferenz zu berechnen
Instant startInstant = Instant.now();
// Simuliere eine zeitaufwändige Operation
try { Thread.sleep(1500); } catch (InterruptedException e) {}
Instant endInstant = Instant.now();
Duration duration5 = Duration.between(startInstant, endInstant);
System.out.println("Ausführungsdauer: " + duration5.toMillis() + "ms");
}
}
Das Ausgabeergebnis ist:
Duration 1: PT2H Duration 2: PT1H30M Duration between times: PT2H30M Parsed Duration: PT2H30M Execution duration: 1501ms
Hinweise
Präzisionsproblem: Die Duration kann bis auf Nanosekundenebene genau sein, aber die tatsächliche Präzision hängt von der Unterstützung des Betriebssystems und der Hardware ab.
Unterschied zu Period:
- Duration wird verwendet, um zeitbasierte Stunden, Minuten und Nanosekunden zu messen
- Period wird verwendet, um datumsbasierte Jahre, Monate und Tage zu messen
Unveränderlichkeit: Alle Duration-Objekte sind unveränderlich; jede Änderungsoperation gibt eine neue Duration-Instanz zurück.
Umgang mit negativen Werten: Duration kann negative Zeitintervalle darstellen, die bei der Berechnung von Zeitdifferenzen auftreten können.
Zeichenfolgenformat: Verwendet das ISO-8601-Dauerformat
PnDTnHnMn.nS, wobei:- P ist der Dauer-Designator
- D ist die Anzahl der Tage
- T ist das Trennzeichen für den Zeitteil
- H ist die Anzahl der Stunden
- M ist die Anzahl der Minuten
- S ist die Anzahl der Sekunden (kann einen Bruchteil haben)
Zusammenfassung
Die Duration-Klasse von Java bietet leistungsstarke und flexible Werkzeuge für Zeitintervalle. Durch die Beherrschung der Verwendung der Duration-Klasse können Entwickler verschiedene zeitrechnungsbezogene Anforderungen leichter bewältigen, wie z. B. Leistungsmessung, Timeout, Aufgabenplanung usw. In Kombination mit anderen in Java 8 eingeführten Datums-/Uhrzeitklassen (wie Instant, LocalDateTime usw.) kann die Duration-Klasse robusteren und besser lesbaren Code zur Zeitverarbeitung erstellen.
Andere Erweiterungen