Período e duração em Java

Período e duração em Java

1. Visão geral

Neste tutorial rápido, vamos dar uma olhada em duas novas classes para trabalhar com datas introduzidas no Java 8:PeriodeDuration.

Ambas as classes podem ser usadas para representar uma quantidade de tempo ou determinar a diferença entre duas datas. A principal distinção entre as duas classes é quePeriod usa valores baseados em data, enquantoDuration usa valores baseados em tempo.

2. ClassePeriod

A classePeriod usa as unidades ano, mês e dia para representar um período de tempo.

Podemos obter um objetoPeriod como a diferença entre duas datas usando o métodobetween():

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

Period period = Period.between(startDate, endDate);

Então, podemos determinar as unidades de data do período usando os métodosgetYears(), getMonths(), getDays():

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

Nesse caso, o métodoisNegative(), que retornatrue se alguma das unidades for negativa, pode ser usado para determinar seendDate é maior do questartDate:

assertFalse(period.isNegative());

SeisNegative() retornar falso, entãostartDate é anterior ao valorendDate.

Outra maneira decreate a Period object is based on the number of days, months, weeks or years usando métodos dedicados:

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 apenas um dos valores estiver presente, por exemplo, usando o métodoofDays(), o valor das outras unidades é 0.

No caso do métodoofWeeks(), o valor do parâmetro é usado para definir o número de dias, multiplicando-o por 7.

Também podemoscreate a Period object by parsing a text sequence, que deve ter o formato “PnYnMnD”:

Period fromCharYears = Period.parse("P2Y");
assertEquals(2, fromCharYears.getYears());

Period fromCharUnits = Period.parse("P2Y3M5D");
assertEquals(5, fromCharUnits.getDays());

O valor do período pode ser aumentado ou diminuído usando métodos da formaplusX()eminusX(), onde X representa a unidade de data:

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

3. ClasseDuration

A classeDuration representa um intervalo de tempo em segundos ou nanossegundos e é mais adequada para lidar com períodos mais curtos de tempo, em casos que exigem mais precisão.

Podemos determinar a diferença entre dois instantes como um objetoDuration usando o métodobetween():

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);

Então, podemos usar os métodosgetSeconds() ougetNanoseconds() para determinar o valor das unidades de tempo:

assertEquals(60, duration.getSeconds());

Como alternativa, podemos obter uma instância Duration de duas instâncias LocalDateTime:

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

Duration.between(start, end).getSeconds();

O métodoisNegative() pode ser usado para verificar se o instante final é superior ao instante inicial:

assertFalse(duration.isNegative());

Também podemosobtain a Duration object based on several time units, usando os métodosofDays(), ofHours(), ofMillis(), ofMinutes(), ofNanos(), ofSeconds():

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

Duration fromMinutes = Duration.ofMinutes(60);

Para criar um objetoDuration com base em uma sequência de texto, ele deve estar no formato “PnDTnHnMn.nS”:

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

A duration can be converted to other time units usandotoDays(), toHours(), toMillis(), toMinutes():

assertEquals(1, fromMinutes.toHours());

Um valor de duração pode ser aumentado ou diminuído usando métodos da formaplusX() ouminusX(), onde X pode representar dias, horas, milis, minutos, nanos ou segundos:

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

Também podemos usar os métodosplus()eminus() com um parâmetro que especifica oTemporalUnit para adicionar ou subtrair:

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

4. Conclusão

Neste tutorial, mostramos como podemos usar as classesPeriodeDuration.

Como sempre, o código-fonte completo dos exemplos pode ser encontradoover on GitHub.