Duration.between în Java

Calculează timpul exact dintre două momente (ore, minute, secunde); negativ dacă sfârșitul e înaintea startului.

Sintaxă
static Duration between(Temporal start, Temporal sfarsitExclusiv)

Ce face Duration.between

Duration.between(start, sfarsit) calculează cât timp trece între două valori cu oră: LocalTime, LocalDateTime, ZonedDateTime sau Instant. Rezultatul este pozitiv dacă sfarsit este după start și negativ altfel.

Cele două valori trebuie să fie de tipuri compatibile. Cu LocalDate (fără oră) metoda aruncă UnsupportedTemporalTypeException; pentru zile între date folosește ChronoUnit.DAYS.between sau Period.between.

Cu ZonedDateTime sau Instant se ține cont de ora de vară. Cu LocalDateTime nu, pentru că nu are fus orar.

Parametri

Parametru Descriere
start Momentul de început (inclus).
sfarsitExclusiv Momentul de sfârșit.

Ce returnează

Un Duration.

Exemple

Exemplul 1: Cât a durat călătoria

import java.time.Duration;
import java.time.LocalDateTime;

public class Main {
    public static void main(String[] args) {
        LocalDateTime plecare = LocalDateTime.of(2026, 10, 19, 22, 40);
        LocalDateTime sosire = LocalDateTime.of(2026, 10, 20, 6, 15);
        Duration d = Duration.between(plecare, sosire);
        System.out.println("Durata: " + d);
        System.out.println("Adică " + d.toHours() + " ore și " + d.toMinutesPart() + " minute");
        System.out.println("Invers: " + Duration.between(sosire, plecare));
    }
}

Rezultat

Durata: PT7H35M
Adică 7 ore și 35 minute
Invers: PT-7H-35M

Exemplul 2: Timp rămas până la închidere

import java.time.Duration;
import java.time.LocalTime;

public class Main {
    public static void main(String[] args) {
        LocalTime inchidere = LocalTime.of(20, 0);
        for (String s : new String[] {"18:25", "19:58", "20:10"}) {
            Duration ramas = Duration.between(LocalTime.parse(s), inchidere);
            if (ramas.isNegative()) {
                System.out.println(s + ": închis");
            } else {
                System.out.println(s + ": mai sunt " + ramas.toMinutes() + " minute");
            }
        }
    }
}

Rezultat

18:25: mai sunt 95 minute
19:58: mai sunt 2 minute
20:10: închis

Exemplul 3: LocalDate nu are oră

import java.time.Duration;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.time.temporal.UnsupportedTemporalTypeException;

public class Main {
    public static void main(String[] args) {
        LocalDate a = LocalDate.of(2026, 10, 19);
        LocalDate b = LocalDate.of(2026, 12, 25);
        try {
            System.out.println(Duration.between(a, b));
        } catch (UnsupportedTemporalTypeException e) {
            System.out.println("Eroare: " + e.getMessage());
        }
        System.out.println("Zile până la Crăciun: " + ChronoUnit.DAYS.between(a, b));
        System.out.println("Ca durată: " + Duration.between(a.atStartOfDay(), b.atStartOfDay()));
    }
}

Rezultat

Eroare: Unsupported unit: Seconds
Zile până la Crăciun: 67
Ca durată: PT1608H

Greșeli frecvente

  • Dai două LocalDate. Aruncă UnsupportedTemporalTypeException; folosește ChronoUnit.DAYS.between sau atStartOfDay().
  • Amesteci tipuri: Duration.between(localTime, localDateTime) aruncă DateTimeException, pentru că o oră fără dată nu poate fi comparată cu o dată.

Comenzi înrudite

  • Duration: O cantitate de timp exactă, în secunde și nanosecunde (1 oră și 30 de minute); se afișează ca PT1H30M.
  • ChronoUnit: Enumerarea unităților de timp (DAYS, MONTHS, HOURS…); ChronoUnit.DAYS.between(a, b) numără zilele dintre două date.
  • Period.between: Calculează perioada dintre două date în ani, luni și zile; getYears, getMonths, getDays citesc fiecare parte.
  • Instant: Un moment exact pe axa timpului, în UTC, măsurat în secunde și nanosecunde de la 1 ianuarie 1970.
  • Duration.toMinutes: Transformă durata într-un număr total de minute (toMinutes) sau milisecunde (toMillis), tăind restul.