Java Instant-Klasse
Die Klasse Instant ist eine wichtige Klasse in der Datums-/Zeit-API (java.time-Paket), die in Java 8 eingeführt wurde. Sie repräsentiert einen momentanen Zeitpunkt auf der Zeitachse. Diese Klasse wird hauptsächlich verwendet, um Zeitstempel mit Nanosekunden-Präzision aufzuzeichnen.
Die Klasse Instant hat die folgenden Hauptmerkmale:
- Repräsentiert die Zeit ab 1970-01-01T00:00:00Z (der Unix-Epoche)
- Enthält keine Zeitzoneninformationen
- Ist unveränderlich und threadsicher
- Präzise auf Nanosekunden (während die traditionelle Date-Klasse nur auf Millisekunden genau ist)
Erstellen eines Instant-Objekts
Den aktuellen Zeitpunkt abrufen
Beispiel
Aus der Epochenzeit erstellen
Beispiel
Instant instant2 = Instant.ofEpochSecond(3, 0); // Wie oben
Instant instant3 = Instant.ofEpochSecond(2, 1_000_000_000); // 1 Nanosekunde nach 3 Sekunden
Instant instant4 = Instant.ofEpochSecond(4, -1_000_000_000); // 1 Nanosekunde vor 3 Sekunden
Aus Millisekunden erstellen
Beispiel
Häufige Methoden der Klasse Instant
Zeitinformationen abrufen
Beispiel
long seconds = instant.getEpochSecond(); // Anzahl der Sekunden seit 1970-01-01 abrufen
int nanos = instant.getNano(); // Den Nanosekundenanteil abrufen
Zeitvergleich
Beispiel
Instant instant2 = instant1.plusSeconds(10);
boolean isBefore = instant1.isBefore(instant2); // true
boolean isAfter = instant1.isAfter(instant2); // false
Zeitarithmetik
Beispiel
// 10 Sekunden hinzufügen
Instant later = instant.plusSeconds(10);
// 5 Minuten subtrahieren
Instant earlier = instant.minus(Duration.ofMinutes(5));
// 2 Tage, 4 Stunden und 30 Minuten hinzufügen
Instant future = instant.plus(2, ChronoUnit.DAYS)
.plus(4, ChronoUnit.HOURS)
.plus(30, ChronoUnit.MINUTES);
Konvertierung zwischen Instant und anderen Datum-Uhrzeit-Klassen
Instant und LocalDateTime
Beispiel
// Instant in LocalDateTime umwandeln
LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
// LocalDateTime in Instant umwandeln
Instant fromLdt = ldt.toInstant(ZoneOffset.UTC);
Instant und ZonedDateTime
Beispiel
// Instant in ZonedDateTime umwandeln
ZonedDateTime zdt = instant.atZone(ZoneId.of("Asia/Shanghai"));
// ZonedDateTime in Instant umwandeln
Instant fromZdt = zdt.toInstant();
Instant und Date
Beispiel
Date date = Date.from(instant);
// Date in Instant umwandeln
Instant fromDate = date.toInstant();
Praktische Anwendungen der Instant-Klasse
Aufzeichnen von Ereignis-Zeitstempeln
Beispiel
private String name;
private Instant timestamp;
public Event(String name) {
this.name = name;
this.timestamp = Instant.now();
}
// Getter...
}
Berechnen von Zeitintervallen
Beispiel
// Einige Operationen ausführen...
Instant end = Instant.now();
Duration duration = Duration.between(start, end);
System.out.println(" milliseconds" + duration.toMillis() + " milliseconds");
Geplante Aufgaben
Beispiel
Instant nextRun = now.plus(1, ChronoUnit.HOURS);
while (Instant.now().isBefore(nextRun)) {
// Warte bis zur angegebenen Zeit
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// Führe die geplante Aufgabe aus
System.out.println("Ausführungszeit der geplanten Aufgabe: " + Instant.now());
Umfassendes Beispiel
Beispiel
import java.time.Duration;
import java.time.temporal.ChronoUnit;
public class InstantExample {
public static void main(String[] args) {
// 1. Den Instant für den aktuellen Moment abrufen
Instant now = Instant.now();
System.out.println("Aktueller Moment: " + now);
// 2. Einen Instant aus einem String parsen
Instant parsedInstant = Instant.parse("2023-05-15T10:15:30.00Z");
System.out.println("Geparster Instant: " + parsedInstant);
// 3. Erzeuge einen Instant für einen bestimmten Zeitpunkt
Instant epochInstant = Instant.ofEpochSecond(0);
System.out.println("Epoch-Zeit (1970-01-01T00:00:00Z): " + epochInstant);
Instant specificInstant = Instant.ofEpochSecond(1684131330);
System.out.println("Bestimmter Zeitstempel: " + specificInstant);
// 4. Zeitarithmetik
Instant later = now.plusSeconds(60); // 60 Sekunden hinzufügen
System.out.println("Nach 60 Sekunden: " + later);
Instant earlier = now.minus(2, ChronoUnit.HOURS); // 2 Stunden abziehen
System.out.println("Vor 2 Stunden: " + earlier);
// 5. Zeitintervall berechnen
Duration duration = Duration.between(earlier, later);
System.out.println("Zeitintervall: " + duration.toMinutes() + " Minuten");
// 6. Zeiten vergleichen
System.out.println("Ist earlier vor later: " + earlier.isBefore(later));
System.out.println("Ist later nach earlier: " + later.isAfter(earlier));
// 7. Zeitstempel abrufen
System.out.println("Sekunden seit Epoche: " + now.getEpochSecond());
System.out.println("Nanosekundenanteil: " + now.getNano());
}
}
Das Ausgabeergebnis ist ähnlich wie das folgende:
当前时刻: 2025-05-01T03:19:09.345806Z 解析的 Instant: 2023-05-15T10:15:30Z 纪元时间 (1970-01-01T00:00:00Z): 1970-01-01T00:00:00Z 特定时间戳: 2023-05-15T06:15:30Z 60秒后: 2025-05-01T03:20:09.345806Z 2小时前: 2025-05-01T01:19:09.345806Z 时间间隔: 121 分钟 earlier 是否在 later 之前: true later 是否在 earlier 之后: true 从纪元开始的秒数: 1746069549 纳秒部分: 345806000
Hinweise zur Instant-Klasse
Zeitzonenprobleme: Instant enthält keine Zeitzoneninformationen; es repräsentiert immer UTC-Zeit. Wenn Sie die Zeit in einer bestimmten Zeitzone anzeigen möchten, müssen Sie sie in ZonedDateTime umwandeln.
Genauigkeitsprobleme: Die Genauigkeit von Instant hängt vom Betriebssystem und der Hardware ab; die meisten Systeme können nur eine Genauigkeit im Millisekundenbereich bieten.
Unveränderlichkeit: Die Klasse Instant ist unveränderlich; alle Änderungsoperationen geben ein neues Instant-Objekt zurück.
Vergleichsoperationen: Beim Vergleich zweier Instant-Objekte sollten Sie die Methoden isBefore() und isAfter() verwenden, anstatt Zeitstempel direkt zu vergleichen.
Serialisierung: Die Klasse Instant implementiert das Interface Serializable und kann sicher serialisiert und deserialisiert werden.