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.