Periodo e durata in Java

1. Panoramica

In questo breve tutorial, daremo uno sguardo a due nuove classi per lavorare con le date introdotte in Java 8: Periodo e Durata .

Entrambe le classi possono essere utilizzate per rappresentare una quantità di tempo o determinare la differenza tra due date. La principale distinzione tra le due classi è che Periodo utilizza valori basati sulla data, mentre Durata utilizza valori basati sul tempo.

2. Classe periodo

La classe Period utilizza le unità anno, mese e giorno per rappresentare un periodo di tempo.

Possiamo ottenere un oggetto Period come differenza tra due date utilizzando il metodo between () :

LocalDate startDate = LocalDate.of(2015, 2, 20); LocalDate endDate = LocalDate.of(2017, 1, 15); Period period = Period.between(startDate, endDate);

Quindi, possiamo determinare le unità di data del periodo utilizzando i metodi getYears (), getMonths (), getDays () :

LOG.info("Years:" + period.getYears() + " months:" + period.getMonths() + " days:"+period.getDays());

In questo caso, il metodo isNegative () , che restituisce true se una qualsiasi delle unità è negativa, può essere utilizzato per determinare se endDate è maggiore di startDate :

assertFalse(period.isNegative());

Se isNegative () restituisce false, startDate è precedente al valore endDate .

Un altro modo per creare un oggetto Periodo è basato sul numero di giorni, mesi, settimane o anni utilizzando metodi dedicati:

Period fromUnits = Period.of(3, 10, 10); Period fromDays = Period.ofDays(50); Period fromMonths = Period.ofMonths(5); Period fromYears = Period.ofYears(10); Period fromWeeks = Period.ofWeeks(40); assertEquals(280, fromWeeks.getDays());

Se è presente solo uno dei valori, ad esempio utilizzando il metodo ofDays () , il valore delle altre unità è 0.

Nel caso del metodo ofWeeks () , il valore del parametro viene utilizzato per impostare il numero di giorni moltiplicandolo per 7.

Possiamo anche creare un oggetto Periodo analizzando una sequenza di testo , che deve avere il formato "PnYnMnD":

Period fromCharYears = Period.parse("P2Y"); assertEquals(2, fromCharYears.getYears()); Period fromCharUnits = Period.parse("P2Y3M5D"); assertEquals(5, fromCharUnits.getDays());

Il valore del periodo può essere aumentato o diminuito utilizzando metodi nella forma plusX () e menoX () , dove X rappresenta l'unità di data:

assertEquals(56, period.plusDays(50).getDays()); assertEquals(9, period.minusMonths(2).getMonths());

3. Classe di durata

La classe Duration rappresenta un intervallo di tempo in secondi o nanosecondi ed è più adatta per gestire periodi di tempo più brevi, nei casi che richiedono maggiore precisione.

Possiamo determinare la differenza tra due istanti come oggetto Duration utilizzando il metodo between () :

Instant start = Instant.parse("2017-10-03T10:15:30.00Z"); Instant end = Instant.parse("2017-10-03T10:16:30.00Z"); Duration duration = Duration.between(start, end);

Quindi possiamo usare i metodi getSeconds () o getNanoseconds () per determinare il valore delle unità di tempo:

assertEquals(60, duration.getSeconds());

In alternativa, possiamo ottenere un'istanza di Duration da due istanze di LocalDateTime:

LocalTime start = LocalTime.of(1, 20, 25, 1024); LocalTime end = LocalTime.of(3, 22, 27, 1544); Duration.between(start, end).getSeconds();

Il metodo isNegative () può essere utilizzato per verificare se l'istante di fine è maggiore dell'istante di inizio:

assertFalse(duration.isNegative());

Possiamo anche ottenere un oggetto Duration basato su diverse unità di tempo , utilizzando i metodi ofDays (), ofHours (), ofMillis (), ofMinutes (), ofNanos (), ofSeconds () :

Duration fromDays = Duration.ofDays(1); assertEquals(86400, fromDays.getSeconds()); Duration fromMinutes = Duration.ofMinutes(60);

Per creare un oggetto Duration basato su una sequenza di testo, questo deve essere nella forma "PnDTnHnMn.nS":

Duration fromChar1 = Duration.parse("P1DT1H10M10.5S"); Duration fromChar2 = Duration.parse("PT10M");

Una durata può essere convertita in altre unità di tempo utilizzando toDays (), toHours (), toMillis (), toMinutes () :

assertEquals(1, fromMinutes.toHours());

Un valore di durata può essere aumentato o diminuito utilizzando metodi del formato plusX () o menoX () , dove X può indicare giorni, ore, millisecondi, minuti, nanos o secondi:

assertEquals(120, duration.plusSeconds(60).getSeconds()); assertEquals(30, duration.minusSeconds(30).getSeconds());

Possiamo anche usare i metodi plus () e minus () con un parametro che specifica TemporalUnit da aggiungere o sottrarre:

assertEquals(120, duration.plus(60, ChronoUnit.SECONDS).getSeconds()); assertEquals(30, duration.minus(30, ChronoUnit.SECONDS).getSeconds());

4. Conclusione

In questo tutorial, abbiamo mostrato come possiamo usare le classi Periodo e Durata .

Come sempre, il codice sorgente completo degli esempi può essere trovato su GitHub.