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 de data e hora existentes 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 no pacote java.util quanto no pacote java.sql. Novamente, as classes de formatação e análise são definidas no pacote java.text.
- O 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 algum. Além disso, ambas as classes têm o mesmo nome, o que é um design muito ruim por si só.
- Não existem classes claramente definidas para hora, timestamp, 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, então elas não são seguras para thread. Este é um dos maiores problemas com as classes de Data e Calendário do Java.
- A classe Date não fornece internacionalização, não há suporte para fuso horário. Então, as classes java.util.Calendar e java.util.TimeZone foram introduzidas, mas também têm todos os problemas listados acima.
Existem algumas outras questões com os métodos definidos nas classes Date e Calendar, mas os problemas acima deixam claro que uma API robusta de Data e Hora era necessária em Java. É por isso que Joda Time desempenhou um papel fundamental como substituto de qualidade para os requisitos de Data e Hora em Java.
Princípios de Design de Data e Hora do Java 8
A API de Data e Hora do Java 8 é uma implementação do JSR-310. Foi projetada para superar todas as falhas nas implementações legadas de data e hora. 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 multithreaded.
-
Separação de Preocupações: A nova API separa claramente entre data e hora legíveis para humanos e tempo de máquina (timestamp Unix). Ela define classes separadas para Data, Hora, DataHora, Timestamp, Fuso Horário, etc.
-
Clareza: Os métodos são claramente definidos e executam 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 usam o Padrão de Fábrica e o Padrão de Estratégia para melhor manipulação. 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 Date-Time vêm com métodos para realizar tarefas comuns, como adição, subtração, formatação, análise, obtenção da 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 seguras para threads. 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 formatar e analisar objetos de data e hora. Na maioria das vezes, não os 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 esses métodos facilmente 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. É hora agora 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 data 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 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 a fuso horário e criação de instância ao passar 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, ele lançará java.time.DateTimeException, que é uma RuntimeException, então não precisamos capturá-la explicitamente.
Também vimos que podemos obter dados de Data/Hora passando ZoneId, você pode obter a lista de valores de ZoneId suportados em seu JavaDoc. Quando executamos a classe acima, obtemos a seguinte saída.
4. Instantâneo
A classe Instantâneo é usada para trabalhar com formato de hora legível por máquina. Instantâneo armazena data e hora em timestamp Unix.
Resultado:
Utilitários da API de Data do Java 8
A maioria das classes de princípio de Data e Hora fornece vários métodos de utilidade, como mais/menos dias, semanas, meses etc. Existem 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, em seguida, analisar uma String para obter os objetos Data e Hora.
Output:
API de Data Java Suporte a Data e Hora Legado
As classes de Data/Hora legadas são usadas em quase todas as aplicações, então ter compatibilidade com versões anteriores é imprescindível. É por isso que existem vários métodos de utilidade através dos quais podemos converter classes legadas em novas classes e vice-versa.
Resultado:
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