36. Trabalho com datas e a API java.time
A manipulação de datas e horas é uma necessidade comum em muitas aplicações Java. Desde o lançamento do Java 8, a API java.time
tornou-se a escolha padrão para trabalhar com datas e horas de forma mais simples e menos suscetível a erros. Esta API foi inspirada na biblioteca Joda-Time e é conhecida por seu design imutável e fluente. Vamos explorar os principais aspectos desta API e como você pode utilizá-la para realizar operações complexas com datas.
Introdução à API java.time
A API java.time
inclui uma série de classes projetadas para lidar com conceitos de tempo como instantes, durações, datas, horas, fusos horários e períodos. As classes são imutáveis e thread-safe, o que significa que você pode usá-las sem preocupações em ambientes multi-thread.
Classes Fundamentais
- LocalDate: Representa uma data sem hora ou fuso horário (por exemplo, 2023-03-15).
- LocalTime: Representa uma hora sem data ou fuso horário (por exemplo, 10:15:30).
- LocalDateTime: Combina
LocalDate
eLocalTime
, representando uma data e hora sem fuso horário. - ZonedDateTime: Representa uma data e hora completa com fuso horário.
- Instant: Representa um ponto específico no tempo, geralmente usado para marcar eventos em aplicações.
- Duration: Representa uma quantidade de tempo em termos de segundos e nanossegundos.
- Period: Representa uma quantidade de tempo em termos de anos, meses e dias.
Manipulação de Datas
A manipulação de datas é facilitada pelas classes LocalDate
, LocalTime
, e LocalDateTime
. Você pode criar instâncias destas classes utilizando seus métodos de fábrica estáticos, como now()
, of()
, e parse()
. Uma vez que você tem uma instância, você pode modificar suas propriedades usando métodos como plusDays()
, minusWeeks()
, withYear()
, entre outros.
LocalDate date = LocalDate.now();
LocalDate tomorrow = date.plusDays(1);
LocalDate lastMonthSameDay = date.minusMonths(1);
LocalDate in2025 = date.withYear(2025);
Formatando e Analisando Datas
A formatação e análise de datas são realizadas principalmente pela classe DateTimeFormatter
. Você pode usar formatadores pré-definidos ou criar o seu próprio para representar datas e horas de acordo com as suas necessidades.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
String formattedDate = date.format(formatter); // "15/03/2023"
LocalDate dateFromString = LocalDate.parse("15/03/2023", formatter);
Trabalhando com Fusos Horários
A classe ZonedDateTime
é usada para lidar com datas e horas em diferentes fusos horários. Você pode converter uma LocalDateTime
para uma ZonedDateTime
aplicando um fuso horário específico usando o método atZone()
. Também é possível ajustar uma ZonedDateTime
para outro fuso horário com o método withZoneSameInstant()
.
ZoneId newYorkZoneId = ZoneId.of("America/New_York");
ZonedDateTime zonedDateTime = LocalDateTime.now().atZone(newYorkZoneId);
ZonedDateTime zonedDateTimeInTokyo = zonedDateTime.withZoneSameInstant(ZoneId.of("Asia/Tokyo"));
Comparando Datas e Horas
Comparar datas e horas é uma operação comum, e a API java.time
oferece métodos como isBefore()
, isAfter()
e isEqual()
para facilitar estas comparações.
boolean isAfter = tomorrow.isAfter(date);
boolean isBefore = lastMonthSameDay.isBefore(date);
boolean isEqual = in2025.isEqual(date.withYear(2025));
Intervalos de Tempo
As classes Duration
e Period
permitem que você represente e manipule intervalos de tempo. Duration
é usado para quantidades de tempo em horas, minutos, segundos e nanossegundos, enquanto Period
é usado para dias, meses e anos.
Duration duration = Duration.between(LocalTime.NOON, LocalTime.MIDNIGHT);
Period period = Period.between(LocalDate.of(2023, Month.JANUARY, 1), LocalDate.of(2023, Month.DECEMBER, 31));
API de Ajuste Temporal
A API java.time
também inclui ajustadores temporais que permitem realizar operações complexas de maneira concisa. Por exemplo, você pode encontrar o primeiro dia do próximo mês, o próximo dia útil ou o último dia do ano usando os ajustadores temporais.
LocalDate firstDayOfNextMonth = date.with(TemporalAdjusters.firstDayOfNextMonth());
LocalDate nextWednesday = date.with(TemporalAdjusters.next(DayOfWeek.WEDNESDAY));
LocalDate lastDayOfYear = date.with(TemporalAdjusters.lastDayOfYear());
Conclusão
A API java.time
é uma ferramenta poderosa e flexível para trabalhar com datas e horas no Java. Com seu design imutável e thread-safe, ela fornece uma maneira confiável e eficiente de manipular conceitos temporais complexos em suas aplicações. Ao dominar esta API, você será capaz de lidar com qualquer desafio relacionado a datas e horas com facilidade.