Duration în Java

O cantitate de timp exactă, în secunde și nanosecunde (1 oră și 30 de minute); se afișează ca PT1H30M.

Sintaxă
import java.time.Duration;

Duration d = Duration.ofMinutes(90);
Duration d = Duration.between(start, sfarsit);
Duration d = Duration.parse("PT1H30M");

Ce face Duration

Duration măsoară timpul în ore, minute, secunde și nanosecunde. Este potrivită pentru durata unui film, a unei ture de lucru sau a unei operații din program. O zi într-o Duration are mereu exact 24 de ore.

toString() folosește formatul ISO-8601: PT1H30M înseamnă „perioadă de timp (P, T) de 1 oră și 30 de minute”. Același format se citește cu Duration.parse. Pentru afișare prietenoasă folosești toHours(), toMinutesPart(), toSecondsPart().

Pentru ani, luni și zile din calendar (vârstă, abonament lunar) folosește Period. Duration este imutabilă, ca toate clasele java.time.

Ce returnează

Un obiect Duration.

Exemple

Exemplul 1: Creare și afișare

import java.time.Duration;

public class Main {
    public static void main(String[] args) {
        Duration film = Duration.ofMinutes(142);
        Duration pauza = Duration.parse("PT15M");
        Duration total = film.plus(pauza);
        System.out.println("Film: " + film + ", pauză: " + pauza + ", total: " + total);
        System.out.printf("Total: %d ore și %d minute%n", total.toHours(), total.toMinutesPart());
        System.out.println("O zi: " + Duration.ofDays(1));
    }
}

Rezultat

Film: PT2H22M, pauză: PT15M, total: PT2H37M
Total: 2 ore și 37 minute
O zi: PT24H

Exemplul 2: Ore lucrate într-o săptămână

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

public class Main {
    public static void main(String[] args) {
        String[][] pontaj = {{"08:55", "17:10"}, {"09:00", "16:45"}, {"08:30", "18:05"}};
        Duration total = Duration.ZERO;
        for (String[] zi : pontaj) {
            Duration d = Duration.between(LocalTime.parse(zi[0]), LocalTime.parse(zi[1]));
            System.out.println(zi[0] + " - " + zi[1] + ": " + d);
            total = total.plus(d);
        }
        System.out.println("Total: " + total.toHours() + "h " + total.toMinutesPart() + "min");
    }
}

Rezultat

08:55 - 17:10: PT8H15M
09:00 - 16:45: PT7H45M
08:30 - 18:05: PT9H35M
Total: 25h 35min

Exemplul 3: Compararea și semnul duratelor

import java.time.Duration;

public class Main {
    public static void main(String[] args) {
        Duration a = Duration.ofSeconds(5400);
        Duration b = Duration.ofMinutes(90);
        System.out.println("Egale? " + a.equals(b));
        System.out.println("compareTo: " + Duration.ofHours(2).compareTo(b));
        Duration negativa = b.minus(Duration.ofHours(2));
        System.out.println(negativa + " negativă? " + negativa.isNegative() + ", absolută: " + negativa.abs());
    }
}

Rezultat

Egale? true
compareTo: 1
PT-30M negativă? true, absolută: PT30M

Greșeli frecvente

  • Folosești Duration.ofDays(30) pentru „o lună”. O lună de calendar nu are mereu 30 de zile; folosește Period.ofMonths(1).
  • Afișezi toMinutes() lângă toHours() și obții „2 ore și 142 minute”. Pentru restul de minute după ore folosește toMinutesPart().

Comenzi înrudite

  • Duration.between: Calculează timpul exact dintre două momente (ore, minute, secunde); negativ dacă sfârșitul e înaintea startului.
  • Duration.ofMinutes: Creează o durată dintr-un număr de minute (ofMinutes) sau secunde (ofSeconds); 90 de minute devin PT1H30M.
  • Duration.toMinutes: Transformă durata într-un număr total de minute (toMinutes) sau milisecunde (toMillis), tăind restul.
  • Duration.plus: Adună două durate și returnează o durată nouă; există și minus, plusMinutes și multipliedBy.
  • Period: O perioadă de calendar în ani, luni și zile (P1Y2M3D); se adună la date ținând cont de lungimea lunilor.
  • ChronoUnit: Enumerarea unităților de timp (DAYS, MONTHS, HOURS…); ChronoUnit.DAYS.between(a, b) numără zilele dintre două date.