1

Trabalhando com Datas no Java

#Java
Paulo Silva
Paulo Silva

Trabalhando com Datas no Java

Descrição do problema:

A partir do Java 8, há uma nova API de datas disponível no pacote java.tme. Essa API é uma excelente adição às bibliotecas padrão do Java.

Após a leitura de artigos como fonte de pesquisa, o que percebi de importante é que, tanto a classe Date, quando a Calendar impõe algumas limitações que podem ser problemáticas e vários projetos que envolvem essas clases:

A classe Calendar, por exemplo não pode ser formatada, sendo necessário extrair e formata-la, não podendo “devolver” o objeto formatado á própria classe. Exemplo:


import java.util.Calendar;
public class Data_Calendar{
    public static void main(String[] args) {
          Calendar c1 = Calendar.getInstance();
          System.out.println("Data e Hora atual: ”+c1.getTime());
    }
}

 

Note, que é preciso usar o .getInstance() para ober a instância ou objeto da classe referente a data; Isso quando implementado gera códigos legados, onde será necessária a refatoração de código em todos os pontos a serem alterados, perdendo performance e tempo de desenvolvimento.

import java.util.Calendar;
public class Testa_Metodo_Get_Calendar{
    public static void main(String[] args) {
          Calendar c1 = Calendar.getInstance();
          System.out.println("Data/Hora atual: "+c1.getTime());
          System.out.println("Ano: "+c1.get(Calendar.YEAR));
          System.out.println("Mês: "+c1.get(Calendar.MONTH));
          System.out.println("Dia do Mês: "+c1.get(Calendar.DAY_OF_MONTH));
    }
}

 

 

Acima, o código exemplifica como é extraído cada “campo” ou item da data. Um processo demorado e custoso visto que para obter-se apenas o dia, por exemplo, é preciso chamar o método get(Calendar.DAY_OF_MONTH)), processo este que, em outras implementações que serão vistas mais a frente é feito de forma bem mais dinâmica e menos dependente.




Classe Date:

É uma classe que ficou obsoleta, sem uso, após novas implementações desse tipo. Isso se dá pela necessidade de internacionalização do sistema de datas. Veja o código a seguir de como a classe Date era implementada:


import java.util.Date;
public class Teste_Date {
    public static void main(String[] args) {
          Date data = new Date();
          System.out.println("Data Agora: "+data);
        }
}


Alguns pontos que chamam atenção na classe Date:

• Ela é mutável, ou seja, pode ser alterada externamente após “setada”;

• Outro ponto é que o ano começa em 1900 precisando de muita atenção em códigos legados pois precisa-se considerar isso ao refatorar (se for usar a mesma classe).

• Os meses são enumerados de 0 a 11, ou seja, o mês de Maio deveria ser instanciado assim:

int month = 5-1;

Isso gera muita confusão na hora de desenvolver um algoritmo usando essa classe.

•SQL: SQL Date é uma data sem tempo, ou seja, trazendo somente o ano-mês-dia, SQL Time traz somente o tempo, ou seja, as horas-minutos-segundos e ainda tem a SQL TimeStamp que visa trazer os dois juntos. Ao trabalhar com essas requisições deve-se ter o cuidado de entender exatamente o que cada uma traz e se é isso que seu algoritmo precisa.

•Além de tudo isso reportado, ainda há problema de bugs ao tentar setar a data ao mesmo tempo por 2 ou mais instâncias, alguns testes unitários podem indicar isso na prática mas o recomendável é não utilizar essa classe pelo que já foi dito no começo da explanação: ela está em desuso e fora dos padrões atuais quando se trabalha com datas.


Solução atual para todos (ou alguns) dos problemas apontados:

O projeto Joda Time, lançado em 2005 é hoje usando amplamente para se trabalhar com datas no Java. É uma biblioteca externa ao JDK/JRE criada por Stephen Colebourne.

Foi apelidada de JavaTime, o problema encontrado anteriormente nas classes Date e Calendar é o fato de serem mutáveis, sendo possível alterar externamente o valor de um atributo. O fato dos anos iniciarem em 1900 das duas classes Date e Calendar também foi sanado aqui.

O pacote java.time juntamente com classes como LocalDate, LocalTime, Period, Instant, ZoneDateTime vieram pra facilitar usos específicos da comunidade desenvolvedora. Todas as classes da API Java Time são imutáveis, corrigindo o problema hora apontado.

Exemplo de uso das classes LocalDate, LocalTime e LocalDateTime

Os parâmetros desses métodos representam um dia, um mês, horas, minutos, segundos e até nano segundos.

Ex: como capturar a tata atual, a hora e a data/hora com o método now()


 

LocalDate dataAtual = LocalDate.now();
System.out.println("Data: " + dataAtual);
LocalTime horaAtual = LocalTime.now();
System.out.println("Hora: " + horaAtual);
LocalDateTime dataHoraAtual = LocalDateTime.now();
System.out.println("Data e Hora: " + dataHoraAtual);


A saída do programa foi:

Data e Hora: 2021-09-27 16:51


Note que, além dos métodos serem claros e objetivos, é possível obter somente trechos da informação e concatena-los caso precise. Fora isso, as funções de conversão também foram otimizadas, tornando o pacote java.time um dos mais utilizados quando se trabalha com datas nos dias atuais. Ele resolve os problemas de mutações e de obtenção de somente horas, ou somente datas por exemplo. Fora que cálculos envolvendo datas como descobrir com base na data de nascimento informada se o usuário pode acessar um determinado conteúdo para maiores ficou bem mais simples de se resolver.


Minha opinião: mesmo após a implementação a partir do Java 8 da nova classe Calendar, o pacote java.time é o que melhor atende as demandas atuais dos algorítimos, visto que, sua implementação e refatoração não exige tanto esforço e corrige problemas tanto da classe Date, já em desuso, quanto da classe Calendar que são classe que quando encontradas em códigos legados exigem muita atenção do programador ao refatorar e implementar novas soluções.

Conforme demonstrei nos exemplos que incluem códigos, o pacote java.time atende muito bem as demandas atuais, a ser estudado caso a caso também dependendo do projeto ou codificação.

0
22

Comentários (1)

1
V

Vitória Poncio

30/09/2021 08:55

Gostei do seu artigo Paulo, me ajudou a entender datas em Java.

Estudante de ADS

Brasil