Alguns detalhes sobre a classe Date que você programador Java deveria saber

A “Date and Time API” que foi introduzida no Java 8, e apesar de ser recente, muita gente sempre usou outras bibliotecas, e quando você for migrar, existem algumas coisinhas sobre essa API que você precisa saber.

Então se você trabalha com desenvolvimento em Java, e vai mexer em sistemas que já estão no ar a algum tempo, é bem provavel que você está usando alguma biblioteca para data e as dicas que eu vou dar aqui vão te ajudar na hora de converter e atualizar esse código para usar a API nativa do Java.

O ano começa em 1900

Primeira pegadinha do Java, o ano da classe Date começa em 1900, ou seja, se você for criar uma data no objeto, você precisa ter o seguinte cuidado:

Date d = new Date(2020, 4, 28, 18, 30);

Olhem o problema ai, o 2020 ali na verdade vai ser somado a 1900, ou seja, vai dar ano 3920. Vai dar ruim isso no seu código, e pra isso funcionar, você deveria fazer isso:

int year = 2020 - 1900;
Date d = new Date (year, 4, 28, 18, 30);

Entendeu o tamanho da encrenca se você tem código legado, porque a grande maioria das bibliotecas fora do Java vai começar no ano 0, vai ter que dar uma analisada para ajustar os anos para não dar pau e jogar todo mundo para 1900 anos no futuro.

Janeiro é 0, Dezembro é 11

E para ajudar mais ainda, na API os meses começam em 0, ou seja, janeiro é o 0 e Dezembro é o 11, então se você analisar o exemplo anterior, parece que colocamos a daa de 28 de Abril, mas não, na verdade ali está representando 28 de Maio. E como resolver isso:

int year = 2020 -1900;
int month = 4 - 1;
Date d = new Date (year, month, 28, 18, 30);

Agora pense no trampo todo do seu código legado que não está preparado para isso, é bem provavel que você tenha que criar um “wrapper” para abstrair isso para a galera ou varrer todo o seu código.

DateFormat não é thread-safe

DateFormat é usado para formatar as datas, e é um objeto pesado. E muitos desenvolvedores colocam a referencia ao DateFormat em um campo estático e usam nas aplicações, e isso pode criar uns bugs muito loucos.

O  DateFormat ou sua implementação mais popular, o SimpleDateFormat guarda a data para ser formatada em um campo interno. E se duas threads tentarem simultaneamente formatar a data, você pode ter uma runtime exception ou receber datas erradas no retorno.

E não é algo teorico, é um problema fácil de acontecer em produção em altos volumes e fácil de reproduzir com testes unitários. O legal que ferramentas de analise de código como Sonar ou Fortify conseguem pegar isso.

Mas é outro ponto a se atentar quando você está produzindo código.

Date é Mutável

Sim, outro ponto de atenção que você precisa ter. Date não é uma constante, ele pode ser modificado depois de criado.

A classe Calendar não pode ser formatada

A classe Calendar foi criada para representar os aspectos da data, como Ano, Mês, dia do mes, dia da semana, etc… Mas trabalhar com ela pode ser um tanto quanto chato, porque você não pode formatar um tipo Calendar, então você precisa extrair a data e então formatar.

6) SQL Date/Time/Timestamp extendem Date

Outro ponto para ficar esperto é que SQL Date é uma data sem tempo, SQL Time é o tempo sem data, e SQL TimeStamp são todos extensões do Java .util.Date. Então os comportamentos acima se extendem a eles também.


O principal ponto a analisar aqui, é que a classe Date no Java 8 melhorou bastante, mas não é perfeita e exige alguns pontos de atenção para você usar no seu código. Se tiver legado e já usar alguma biblioteca (como o Jodatime, por exemplo), a diferença vai ser grande e vai exigir refatoração, e se for em um código novo, você precisa se atentar a esses pontos para não ter problemas em código concorrente, ou geração de anos e meses errados.

Publicado por

serlopes

Nerd, geek, músico de garagem, gamer e pai. Curte tudo que envolve esse universo maravilhoso e muita música, desde que seja de qualidade.

Um comentário sobre “Alguns detalhes sobre a classe Date que você programador Java deveria saber”

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s