Duration — was es ist, Berechnen der Dauer in Android

Autor: IT Sectr Veröffentlicht: 2026-07-13 Lesezeit: 9 Min.

Duration — eine unveränderliche Klasse aus dem Paket java.time, die die Dauer zwischen zwei Zeitpunkten in Sekunden und Nanosekunden darstellt. Duration misst zeitbasierte Zeitmengen — Stunden, Minuten, Sekunden, Millisekunden und Nanosekunden. Laut Spezifikation von Oracle Java 17 (2024) arbeitet Duration im Gegensatz zu Period (das Jahre-Monate-Tage misst) mit genauen Zeiteinheiten und ist nicht vom Kalender abhängig.

Wichtige Erkenntnisse

  • Duration — eine unveränderliche Klasse zum Messen der Dauer in Sekunden und Nanosekunden.
  • Im Gegensatz zu Period arbeitet Duration mit zeitbasierten Einheiten (Stunden, Minuten, Sekunden), nicht mit datumsbasierten (Tage, Monate, Jahre).
  • Erstellt wird sie über Duration.between(start, end), Duration.ofMinutes(), Duration.ofHours() und andere statische Factory-Methoden.
  • Unterstützt arithmetische Operationen: plus(), minus(), multipliedBy(), dividedBy(), negated().
  • Für die Android-Entwicklung ist Duration praktisch zur Berechnung von Timeouts, Synchronisationsintervallen und Operationsdauern.

Was ist Duration?

Duration ist eine Klasse, die die Zeitspanne in Sekunden und Nanosekunden modelliert. Sie repräsentiert eine zeitbasierte Dauer, also eine physikalische Anzahl von Sekunden, die nicht an einen Kalender gebunden ist. Duration kann man sich als „125 Minuten“ oder „2 Stunden 5 Minuten“ vorstellen — im Gegensatz zu Period, das „2 Monate“ sagen würde.

Die interne Darstellung von Duration besteht aus zwei Feldern: long seconds (Sekunden) und int nanos (Nanosekunden, 0 bis 999999999). Der Wert kann negativ sein — das bedeutet eine Dauer „rückwärts“ in der Zeit. Der Maximalwert beträgt ±31557014167219200 Sekunden.

Laut Baeldung (2024) ist Duration eine Schlüsselklasse zur Berechnung der Operationsdauer, zum Festlegen von Timeouts und zum Messen der Leistung. Duration ist unveränderlich und thread-sicher, was die Verwendung in Multithread-Umgebungen ohne Synchronisation ermöglicht.

Die Klasse implementiert die Schnittstellen Comparable, TemporalAmount und TemporalUnit. TemporalAmount ermöglicht die Verwendung von Duration in den plus/minus-Methoden der Klassen LocalTime, LocalDateTime, Instant und ZonedDateTime.

Duration vs Period: Was ist der Unterschied?

Der Hauptunterschied besteht darin, dass Duration die genaue Anzahl der Sekunden (zeitbasiert) misst, während Period Kalendereinheiten (datumsbasiert) misst: Jahre, Monate, Tage. Duration sagt: „86400 Sekunden sind vergangen.“ Period sagt: „1 Tag ist vergangen.“ Der Unterschied wird bei Sommerzeitumstellungen deutlich — 1 Tag in Period ist immer 1 Kalendertag, während 86400 Sekunden in Duration während der DST 23 oder 25 Stunden entsprechen können.

Duration wird zur Messung der physikalischen Zeit verwendet: Verbindungs-Timeouts, Abfrageausführungszeit, Intervalle zwischen zwei Instant. Period wird für Kalenderberechnungen verwendet: Alter einer Person (Period.between(dateOfBirth, today)), Vertragsdauer.

Duration arbeitet mit Sekunden und Nanosekunden und kann daher in Teile (Stunden, Minuten) zerlegt werden. Period arbeitet mit Jahren, Monaten und Tagen — unteilbare Kalendereinheiten. Laut Oracle Java Tutorial (2024) hängt die Wahl zwischen Duration und Period von der Aufgabenart ab: genaue Zeit vs. Kalenderdaten.

Duration erstellen

Die gebräuchlichste Methode ist Duration.between(Temporal start, Temporal end). Temporal kann Instant, LocalTime, LocalDateTime, ZonedDateTime sein — jeder Typ, der Temporal implementiert. Die Methode gibt eine Duration zurück, die die Differenz start - end darstellt (kann negativ sein).

Statische Factory-Methoden: Duration.ofSeconds(long), ofMinutes(long), ofHours(long), ofDays(long), ofMillis(long), ofNanos(long). Es gibt auch of(long amount, TemporalUnit unit) für beliebige Einheiten — ChronoUnit.HOURS, ChronoUnit.MINUTES und andere.

Die Methode parse(CharSequence) akzeptiert einen String im ISO-8601-Format: „PT1H30M“ (1 Stunde 30 Minuten), „PT45S“ (45 Sekunden), „P2DT3H“ (2 Tage 3 Stunden). Der String beginnt immer mit „PT“ (Period of Time).

kotlin
val betweenMoments = Duration.between(
    Instant.parse("2026-07-21T10:00:00Z"),
    Instant.parse("2026-07-21T14:30:00Z")
)

val fromMinutes = Duration.ofMinutes(90)
val fromHours = Duration.ofHours(2)
val parsed = Duration.parse("PT1H30M")

Arithmetik mit Duration

Duration unterstützt einen vollständigen Satz arithmetischer Operationen. Die Methoden plus(Duration) und minus(Duration) addieren oder subtrahieren eine andere Dauer. Die Methoden plusDays(), plusHours(), plusMinutes(), plusSeconds(), plusMillis(), plusNanos() — zum gezielten Hinzufügen von Einheiten.

Für Multiplikation und Division werden multipliedBy(long) und dividedBy(long) verwendet. Duration.multipliedBy(2) verdoppelt die Dauer. Duration.dividedBy(3) teilt in drei Teile mit Abrundung. Die Methode negated() kehrt das Vorzeichen um — positiv wird negativ und umgekehrt.

Die Methode abs() gibt eine Duration mit absolutem (positivem) Wert zurück. isNegative() und isZero() sind Prüfungen. toDays(), toHours(), toMinutes(), toSeconds(), toMillis(), toNanos() konvertieren in die entsprechenden Einheiten.

kotlin
val oneHour = Duration.ofHours(1)
val twoHours = oneHour.plus(Duration.ofMinutes(60))
val halfHour = oneHour.dividedBy(2)

val minutes = twoHours.toMinutes()
val absDuration = (Duration.ofHours(-1)).abs()

Duration vergleichen

Duration implementiert die Schnittstelle Comparable, was einen natürlichen Vergleich von Dauern ermöglicht. Die Methode compareTo() gibt eine negative Zahl, Null oder eine positive Zahl zurück. isNegative() und isZero() sind schnelle Prüfungen. Für explizite Vergleiche verwenden Sie equals() — zwei Duration sind gleich, wenn ihre Sekunden und Nanosekunden übereinstimmen.

Da Duration negativ sein kann, funktionieren Vergleiche von „größer“ oder „kleiner“ unter Berücksichtigung des Vorzeichens. -5 Minuten sind kleiner als 2 Minuten. Die Methode abs() ist nützlich, um „absolute“ Längen unabhängig von der Richtung zu vergleichen.

In Kotlin unterstützt Duration Vergleichsoperatoren durch Operator-Overloading: a < b, a > b, a <= b. Plus und Minus sind ebenfalls als Operatoren verfügbar: a + b, a - b.

kotlin
val short = Duration.ofMinutes(5)
val long = Duration.ofMinutes(10)

if (short < long) {
    Log.d("Duration", "5 Min ist weniger als 10")
}

val negative = Duration.ofMinutes(-3)
Log.d("Duration", "Negativ: ${negative.isNegative()}")

Duration in realen Android-Aufgaben

Das erste Beispiel ist die Konfiguration der periodischen Synchronisation mit dem Server. Duration wird verwendet, um das Intervall zwischen Synchronisationen zu berechnen und zu prüfen, ob das Zeitlimit ohne Update überschritten wurde.

kotlin
data class SyncConfig(
    val interval: Duration = Duration.ofMinutes(15),
    val retryDelay: Duration = Duration.ofSeconds(30)
)

fun calculateNextSync(
    lastSync: Instant,
    config: SyncConfig
): Duration {
    val elapsed = Duration.between(lastSync, Instant.now())
    return config.interval.minus(elapsed)
        .coerceAtLeast(Duration.ZERO)
}

Das zweite Beispiel ist die Messung der Ausführungszeit einer Operation für die Leistungsprotokollierung.

kotlin
fun measureExecution(
    tag: String,
    block: () -> Unit
) {
    val start = Instant.now()
    block()
    val duration = Duration.between(start, Instant.now())
    Log.d(tag, "Ausgeführt in ${duration.toMillis()} ms")
}

Das dritte Beispiel ist die Berechnung der verbleibenden Zeit eines Timers (z. B. Countdown bis zum Ende einer Aktion).

kotlin
class CountdownTimer(
    private val expiresAt: Instant
) {
    fun getRemainingTime(): Duration {
        val remaining = Duration.between(
            Instant.now(), expiresAt
        )
        return remaining.coerceAtLeast(Duration.ZERO)
    }

    fun isExpired(): Boolean = getRemainingTime() == Duration.ZERO
}

Duration in String umwandeln

Die Methode toString() gibt Duration im ISO-8601-Format zurück: „PT1H30M“ (1 Stunde 30 Minuten), „PT45.5S“ (45.5 Sekunden). Dieses Format ist für den Maschinenaustausch praktisch, aber nicht für die Benutzeranzeige.

Für ein menschenlesbares Format verwenden Sie toDays(), toHours(), toMinutes(), toSeconds() mit anschließender manueller String-Erstellung. Zum Beispiel: „${days} T ${hours} Std ${minutes} Min“. Beachten Sie, dass toHours() die Gesamtzahl der Stunden zurückgibt, nicht die Stunden innerhalb eines Tages.

Zum Zerlegen von Duration in Komponenten verwenden Sie die Formel: val hours = duration.toHours(); val minutes = duration.toMinutes() % 60; val seconds = duration.seconds % 60. Laut Apache Commons Lang (2024) bietet die Bibliothek DurationFormatUtils zusätzliche Formatierungsmöglichkeiten.

kotlin
fun formatDuration(duration: Duration): String {
    val hours = duration.toHours()
    val minutes = duration.toMinutes() % 60
    val seconds = duration.seconds % 60

    return buildString {
        if (hours > 0) append("${hours} h ")
        if (minutes > 0) append("${minutes} min ")
        append("${seconds} sec")
    }
}

Häufige Fehler

Der erste Fehler ist die Verwechslung von Duration und Period bei der Arbeit mit Daten. Duration misst Sekunden, daher ist Duration.ofDays(1) immer 24 Stunden (86400 Sekunden), unabhängig von Sommerzeitumstellungen. Wenn Sie einen Kalendertag benötigen, verwenden Sie Period.ofDays(1).

Der zweite Fehler ist der Verlust von Nanosekunden bei der Konvertierung. Duration kann Nanosekunden speichern, aber toMillis() und toSeconds() verwerfen sie. Verwenden Sie für genaue Berechnungen toNanos() oder arbeiten Sie direkt mit Duration, ohne in primitive Typen zu konvertieren.

Der dritte Fehler ist das Ignorieren negativer Duration. Duration.between(start, end) gibt start - end zurück. Wenn start nach end liegt, ist Duration negativ. Die Methode abs() hilft, den absoluten Wert zu erhalten, und isNegative() prüft die Reihenfolge der Argumente.

Der vierte Fehler ist die falsche Formatierung von Duration für die Benutzeroberfläche. Duration.toString() gibt ISO-8601 zurück, das nicht lesbar ist. Formatieren Sie Duration für die Benutzeranzeige immer manuell mit toHours(), toMinutes() und toSeconds() mit dem korrekten Divisionsrest.

Häufig gestellte Fragen

Kann Duration negativ sein?

Ja, Duration kann negativ sein. Duration.between(start, end) gibt start - end zurück. Wenn start nach end liegt, ist Duration negativ. Verwenden Sie abs(), um den absoluten Wert zu erhalten, oder isNegative() zur Prüfung.

Wie addiert man zwei Duration?

Verwenden Sie die Methode plus(Duration) oder den +-Operator in Kotlin: duration1 + duration2. Das Ergebnis ist eine neue Duration. Die Methode minus(Duration) subtrahiert eine Dauer von einer anderen. Alle Operationen sind unveränderlich und geben ein neues Objekt zurück.

Wie unterscheidet sich Duration.ofDays(1) von Period.ofDays(1)?

Duration.ofDays(1) ist immer 24 Stunden (86400 Sekunden). Period.ofDays(1) ist 1 Kalendertag, der während der DST 23 oder 25 Stunden betragen kann. Für genaue Zeitberechnungen verwenden Sie Duration, für Kalenderberechnungen Period.

Wie konvertiert man Duration in Millisekunden?

Verwenden Sie die Methode toMillis(). Sie gibt einen long zurück — die Anzahl der Millisekunden in der Duration. Für Nanosekunden verwenden Sie toNanos(). Achtung: toNanos() kann bei Werten > 292 Jahren einen long-Überlauf verursachen. Für große Durations verwenden Sie toSeconds() oder toMinutes().

Wie berechnet man Duration zwischen zwei LocalTime?

Verwenden Sie Duration.between(startTime, endTime). Wenn endTime kleiner als startTime ist (Nachtschicht), ist Duration negativ. Fügen Sie 24 Stunden hinzu: duration.plusHours(24), wenn angenommen wird, dass endTime der nächste Tag ist.

Zusammenfassung

  • Duration — eine unveränderliche Klasse für zeitbasierte Dauer mit Nanosekunden-Genauigkeit, ideal zum Messen von Intervallen.
  • Der Hauptunterschied zu Period — Duration misst Sekunden (physikalische Zeit), Period misst Kalendereinheiten.
  • Erstellt wird sie über Duration.between() für die Differenz zwischen Zeitpunkten oder über statische Fabriken ofMinutes, ofHours, ofDays.
  • Unterstützt Arithmetik: plus, minus, multipliedBy, dividedBy, sowie Vergleich über Comparable und abs.
  • In Android wird Duration zur Berechnung von Timeouts, Synchronisationsintervallen, Timern und Leistungsmessung verwendet.
  • Formatieren Sie Duration bei der Benutzeranzeige manuell — toString() gibt ISO-8601 aus, das für Menschen nicht lesbar ist.
  • Beachten Sie, dass Duration negativ sein kann — prüfen Sie isNegative() und verwenden Sie abs() für korrekte Berechnungen.

Wir entwickeln eine mobile Applikation schlüsselfertig

IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.

Projekt besprechen

Lesen Sie auch