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

Instant now = Instant.now();  // Aktuellen Zeitpunkt abrufen

Aus der Epochenzeit erstellen

Beispiel

Instant instant1 = Instant.ofEpochSecond(3);  // 1970-01-01T00:00:03Z
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

Instant instant = Instant.ofEpochMilli(1000);  // 1970-01-01T00:00:01Z

Häufige Methoden der Klasse Instant

Zeitinformationen abrufen

Beispiel

Instant instant = Instant.now();

long seconds = instant.getEpochSecond();  // Anzahl der Sekunden seit 1970-01-01 abrufen
int nanos = instant.getNano();  // Den Nanosekundenanteil abrufen

Zeitvergleich

Beispiel

Instant instant1 = Instant.now();
Instant instant2 = instant1.plusSeconds(10);

boolean isBefore = instant1.isBefore(instant2);  // true
boolean isAfter = instant1.isAfter(instant2);  // false

Zeitarithmetik

Beispiel

Instant instant = Instant.now();

// 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 instant = Instant.now();

// 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 instant = Instant.now();

// Instant in ZonedDateTime umwandeln
ZonedDateTime zdt = instant.atZone(ZoneId.of("Asia/Shanghai"));

// ZonedDateTime in Instant umwandeln
Instant fromZdt = zdt.toInstant();

Instant und Date

Beispiel

// Instant in Date umwandeln
Date date = Date.from(instant);

// Date in Instant umwandeln
Instant fromDate = date.toInstant();

Praktische Anwendungen der Instant-Klasse

Aufzeichnen von Ereignis-Zeitstempeln

Beispiel

public class Event {
    private String name;
    private Instant timestamp;
   
    public Event(String name) {
        this.name = name;
        this.timestamp = Instant.now();
    }
   
    // Getter...
}

Berechnen von Zeitintervallen

Beispiel

Instant start = Instant.now();
// 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 now = Instant.now();
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.Instant;
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

  1. 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.

  2. Genauigkeitsprobleme: Die Genauigkeit von Instant hängt vom Betriebssystem und der Hardware ab; die meisten Systeme können nur eine Genauigkeit im Millisekundenbereich bieten.

  3. Unveränderlichkeit: Die Klasse Instant ist unveränderlich; alle Änderungsoperationen geben ein neues Instant-Objekt zurück.

  4. Vergleichsoperationen: Beim Vergleich zweier Instant-Objekte sollten Sie die Methoden isBefore() und isAfter() verwenden, anstatt Zeitstempel direkt zu vergleichen.

  5. Serialisierung: Die Klasse Instant implementiert das Interface Serializable und kann sicher serialisiert und deserialisiert werden.

Weitere Erweiterungen