O API de Data e Hora é um dos maiores recursos do lançamento do Java 8. O Java estava sem uma abordagem consistente para Data e Hora desde o início e o API de Data e Hora do Java 8 é uma adição bem-vinda às APIs principais do Java.
Por que precisamos de um novo API de Data e Hora do Java?
Antes de começarmos a olhar para o API de Data e Hora do Java 8, vamos ver por que precisamos de um novo API para isso. Houve vários problemas com as classes existentes relacionadas a data e hora em java, alguns deles são:
- As classes de Data e Hora do Java não são definidas de forma consistente, temos a classe Date tanto nos pacotes java.util quanto java.sql. Novamente, as classes de formatação e análise são definidas no pacote java.text.
- A classe java.util.Date contém tanto valores de data quanto de hora, enquanto java.sql.Date contém apenas valores de data. Ter isso no pacote java.sql não faz sentido. Além disso, ambas as classes têm o mesmo nome, o que é um design muito ruim em si mesmo.
- Não existem classes claramente definidas para tempo, carimbo de data e hora, formatação e análise. Temos a classe abstrata java.text.DateFormat para necessidades de análise e formatação. Geralmente, a classe SimpleDateFormat é usada para análise e formatação.
- Todas as classes de Data são mutáveis, portanto, elas não são seguras para threads. Este é um dos maiores problemas com as classes de Data e Calendário do Java.
- A classe Date não oferece internacionalização, nem suporte a fuso horário. Portanto, as classes java.util.Calendar e java.util.TimeZone foram introduzidas, mas elas também têm todos os problemas listados acima.
Há algumas outras questões com os métodos definidos nas classes Date e Calendar, mas os problemas acima deixam claro que uma API de Data e Hora robusta era necessária em Java. Por isso, o Joda Time teve um papel fundamental como uma substituição de qualidade para os requisitos de Data e Hora em Java.
Princípios de Design do Java 8 Date Time
A API de Data e Hora do Java 8 é uma implementação do JSR-310. Ela é projetada para superar todas as falhas nas implementações de data e hora legadas. Alguns dos princípios de design da nova API de Data e Hora são:
-
Imutabilidade: Todas as classes na nova API de Data e Hora são imutáveis e adequadas para ambientes multithread.
-
Separation of Concerns: A nova API separa claramente entre data e hora legíveis por humanos e tempo de máquina (timestamp Unix). Ela define classes separadas para Data, Hora, DateTime, Timestamp, Timezone, etc.
-
Clareza: Os métodos são claramente definidos e realizam a mesma ação em todas as classes. Por exemplo, para obter a instância atual, temos o método now(). Existem métodos format() e parse() definidos em todas essas classes, em vez de ter uma classe separada para eles.
Todas as classes utilizam o Padrão de Fábrica e o Padrão de Estratégia para um melhor manuseio. Uma vez que você tenha usado os métodos em uma das classes, trabalhar com outras classes não será difícil.
-
Operações de utilidade: Todas as novas classes da API de Data e Hora vêm com métodos para realizar tarefas comuns, como adicionar, subtrair, formatar, analisar, obter a parte separada na data/hora, etc.
-
Extensível: A nova API de Data e Hora funciona no sistema de calendário ISO-8601, mas podemos usá-la com outros calendários não ISO também.
Pacotes da API de Data e Hora
A API de Data e Hora do Java 8 consiste nos seguintes pacotes.
- java.time: Este é o pacote base da nova API de Data e Hora do Java. Todas as principais classes base fazem parte deste pacote, como LocalDate, LocalTime, LocalDateTime, Instant, Period, Duration, etc. Todas essas classes são imutáveis e thread-safe. Na maioria das vezes, essas classes serão suficientes para lidar com requisitos comuns.
- java.time.chrono: Este pacote define APIs genéricas para sistemas de calendário não ISO. Podemos estender a classe AbstractChronology para criar nosso próprio sistema de calendário.
- java.time.formato: Este pacote contém classes usadas para formatação e análise de objetos de data e hora. Na maioria das vezes, não as usaríamos diretamente porque as classes principais no pacote java.time fornecem métodos de formatação e análise.
- java.time.temporal: Este pacote contém objetos temporais e podemos usá-lo para descobrir as datas ou horas específicas relacionadas aos objetos de data/hora. Por exemplo, podemos usá-los para descobrir o primeiro ou último dia do mês. Você pode identificar facilmente esses métodos porque sempre têm o formato “withXXX”.
- Pacote java.time.zone: Este pacote contém classes para suportar diferentes fusos horários e suas regras.
Exemplos de Classes da API de Data e Hora do Java 8
Nós examinamos a maioria das partes importantes da API de Data e Hora do Java. Agora é hora de examinar as classes mais importantes da API de Data e Hora com exemplos.
1. LocalDate
LocalDate é uma classe imutável que representa uma Data com o formato padrão de yyyy-MM-dd. Podemos usar o método now() para obter a data atual. Também podemos fornecer argumentos de entrada para ano, mês e dia para criar uma instância de LocalDate.
Esta classe fornece um método sobrecarregado para now() onde podemos passar ZoneId para obter datas em um fuso horário específico. Esta classe fornece a mesma funcionalidade que java.sql.Date.
Explicação dos métodos de LocalDate é fornecida nos comentários. Quando executamos este programa, obtemos a seguinte saída.
2. LocalTime
LocalTime é uma classe imutável cuja instância representa um horário no formato legível para humanos. Seu formato padrão é hh:mm:ss.zzz. Assim como LocalDate, esta classe fornece suporte para fuso horário e cria instância passando hora, minuto e segundo como argumentos de entrada.
Saída:
3. LocalDateTime
LocalDateTime é um objeto de data e hora imutável que representa uma data e hora com o formato padrão yyyy-MM-dd-HH-mm-ss.zzz. Ele fornece um método de fábrica que recebe argumentos de entrada LocalDate e LocalTime para criar uma instância de LocalDateTime.
Em todos os três exemplos, vimos que se fornecermos argumentos inválidos para criar Data/Hora, então ele lança java.time.DateTimeException, que é um RuntimeException, então não precisamos capturá-lo explicitamente.
Também vimos que podemos obter dados de Data/Hora passando o ZoneId, você pode obter a lista de valores de ZoneId suportados a partir do JavaDoc. Quando executamos a classe acima, obtemos a seguinte saída.
4. Instante
A classe Instante é usada para trabalhar com formato de hora legível por máquina. Instante armazena data e hora em timestamp Unix.
Saída:
Utilitários da API de Data do Java 8
A maioria das classes de princípios de Data e Hora fornece vários métodos de utilidade, como mais/menos dias, semanas, meses, etc. Existem alguns outros métodos de utilidade para ajustar a data usando o TemporalAdjuster
e para calcular o período entre duas datas.
Output:
Java 8 Análise e Formatação de Datas
É muito comum formatar datas em diferentes formatos e depois analisar uma String para obter objetos de Data e Hora.
Output:
Compatibilidade com a Data e Hora Legadas da API Java
As classes de Data/Hora legadas são usadas em quase todas as aplicações, então ter compatibilidade com versões anteriores é essencial. É por isso que existem vários métodos de utilidade por meio dos quais podemos converter classes legadas em novas classes e vice-versa.
Output:
Como você pode ver, os métodos toString() das classes legadas TimeZone e GregorianCalendar são muito verbosos e não amigáveis para o usuário.
Conclusão
I like this new Date Time API a lot. Some of the most used classes will be LocalDate and LocalDateTime. It’s very easy to work with the new classes. And, having similar methods that does a particular job makes it easy to find. It will take some time from moving legacy classes to new Date Time classes, but I believe it will be worth the time and effort.
Source:
https://www.digitalocean.com/community/tutorials/java-8-date-localdate-localdatetime-instant