java.util.Date vs java.sql.Date

java.util.Date vs java.sql.Date

**

1. Visão geral

Neste tutorial, vamos comparar duas classes de data:java.util.Dateejava.sql.Date.

Depois de concluir a comparação, deve ficar claro qual deles usar e por quê.

2. java.util.Date

The java.util.Date class represents a particular moment in time, with millisecond precision since the 1st of January 1970 00:00:00 GMT (the epoch time). A classe é usada para manter o tempo universal coordenado (UTC).

Podemos inicializá-lo de duas maneiras.

Chamando o construtor:

Date date = new Date();

que criará um novo objetodate com o tempo definido para o tempo atual, medido no milissegundo mais próximo.

Ou passando vários milissegundos desde a época:

long timestamp = 1532516399000; // 25 July 2018 10:59:59 UTC
Date date = new Date(timestamp);

Vamos observar que outros construtores, presentes antes do Java 8, estão obsoletos agora.

No entanto,Date has a number of issues and overall its usage isn’t recommended anymore.

É mutável. Uma vez inicializado, podemos alterar seu valor interno. Por exemplo, podemos chamar o métodosetTime:

date.setTime(0); // 01 January 1970 00:00:00

Para saber mais sobre as vantagens dos objetos imutáveis, consulte este artigo:Immutable Objects in Java.

Ele também não lida muito bem com todas as datas. Tecnicamente, deve refletir o tempo universal coordenado (UTC). No entanto, isso depende de um sistema operacional do ambiente host.

A maioria dos sistemas operacionais modernos usa 1 dia = 24h x 60m x 60s = 86400 segundos, o que, como podemos ver, não leva o "segundo bissexto" em consideração.

With the introduction of Java 8, java.time package should be used. Antes do Java 8, uma solução alternativa estava disponível -Joda Time.

3. java.sql.Date

Ojava.sql.Date estende a classejava.util.Date.

Seu principal objetivo é representar o SQL DATE, que mantém anos, meses e dias. Nenhum dado de tempo é mantido.

De fato, a data é armazenada em milissegundos desde 1º de janeiro de 1970 às 00:00:00 GMT e a parte da hora é normalizada, ou seja, definido como zero.

Basicamente, é um wrapper em torno dejava.util.Date que lida com requisitos específicos de SQL. java.sql.Date deve ser usado apenas ao lidar com bancos de dados.

No entanto, comojava.sql.Date não contém informações de fuso horário, a conversão de fuso horário entre nosso ambiente local e o servidor de banco de dados depende de uma implementação do driver JDBC. Isso adiciona outro nível de complexidade.

Finalmente, vamos notar, a fim de suportar outros tipos de dados SQL: SQL TIME e SQL TIMESTAMP, duas outras classesjava.sql estão disponíveis:TimeeTimestamp.

O último, embora se estenda dejava.util.Date, oferece suporte a nanossegundos.

4. Conclusão

A classejava.util.Date armazena um valor de data e hora em milissegundos desde a época. java.sql.Date armazena um valor apenas de data e é comumente usado em JDBC.

O manuseio de datas é complicado. Precisamos lembrar de casos especiais: segundos bissextos, fusos horários diferentes etc. Ao lidar com JDBC, podemos usarjava.sql.Date com cautela.

Se vamos usarjava.util.Date,, precisamos nos lembrar de suas deficiências. Se estiver usando Java 8, é melhor não usarjava.util.Date.

**