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 e LocalTime, 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.

Agora responda o exercício sobre o conteúdo:

Qual das seguintes afirmações sobre a API `java.time` é verdadeira?

Você acertou! Parabéns, agora siga para a próxima página

Você errou! Tente novamente.

Imagem do artigo Internacionalização e localização em Java

Próxima página do Ebook Gratuito:

148Internacionalização e localização em Java

5 minutos

Ganhe seu Certificado deste Curso Gratuitamente! ao baixar o aplicativo Cursa e ler o ebook por lá. Disponível na Google Play ou App Store!

Disponível no Google Play Disponível no App Store

+ de 6,5 milhões
de alunos

Certificado Gratuito e
Válido em todo o Brasil

48 mil exercícios
gratuitos

4,8/5 classificação
nas lojas de apps

Cursos gratuitos em
vídeo, áudio e texto