java.util.Date frente a java.sql.Date

1. Información general

En este tutorial, vamos a comparar dos clases de fecha: java.util.Date y java.sql.Date .

Una vez que completemos la comparación, debe quedar claro cuál usar y por qué.

2. java.util.Date

La clase java.util.Date representa un momento particular en el tiempo, con una precisión de milisegundos desde el 1 de enero de 1970 a las 00:00:00 GMT (la hora de la época) . La clase se utiliza para mantener la hora universal coordinada (UTC).

Podemos inicializarlo de dos formas.

Llamando al constructor:

Date date = new Date();

que creará un nuevo objeto de fecha con la hora establecida en la hora actual, medida al milisegundo más cercano.

O pasando varios milisegundos desde la época:

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

Observemos que otros constructores, presentes antes de Java 8, ahora están en desuso.

Sin embargo, Date tiene varios problemas y, en general, ya no se recomienda su uso .

Es mutable. Una vez que lo inicializamos, podemos cambiar su valor interno. Por ejemplo, podemos llamar al método setTime :

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

Para obtener más información sobre las ventajas de los objetos inmutables, consulte este artículo: Objetos inmutables en Java.

Tampoco maneja muy bien todas las fechas. Técnicamente, debería reflejar la hora universal coordinada (UTC). Sin embargo, eso depende del sistema operativo del entorno host.

La mayoría de los sistemas operativos modernos utilizan 1 día = 24 h x 60 m x 60 s = 86400 segundos, lo que, como podemos ver, no tiene en cuenta el "segundo intercalar".

Con la introducción de Java 8, debería utilizarse el paquete java.time . Antes de Java 8, estaba disponible una solución alternativa: Joda Time .

3. java.sql.Date

El java.sql.Date extiende java.util.Date clase.

Su propósito principal es representar SQL DATE, que guarda años, meses y días. No se guardan datos de tiempo.

De hecho, la fecha se almacena en milisegundos desde el 1 de enero de 1970 a las 00:00:00 GMT y la parte de tiempo se normaliza, es decir, se pone a cero.

Básicamente, es un contenedor de java.util.Date que maneja los requisitos específicos de SQL. java.sql.Date debe usarse solo cuando se trata de bases de datos.

Sin embargo, como java.sql.Date no contiene información de zona horaria, la conversión de zona horaria entre nuestro entorno local y el servidor de base de datos depende de una implementación del controlador JDBC. Esto agrega otro nivel de complejidad.

Finalmente, observemos, para admitir otros tipos de datos SQL: SQL TIME y SQL TIMESTAMP, hay otras dos clases java.sql disponibles: Time y Timestamp .

Este último, aunque se extiende desde java.util.Date , admite nanosegundos.

4. Conclusión

La clase java.util.Date almacena un valor de fecha y hora en milisegundos desde la época. java.sql.Date almacena un valor de solo fecha y se usa comúnmente en JDBC.

Manejar las fechas es complicado. Debemos recordar casos especiales: segundos intercalares, diferentes zonas horarias, etc. Cuando se trata de JDBC, podemos usar java.sql.Date con precaución.

Si vamos a usar java.util.Date, debemos recordar sus deficiencias. Si usa Java 8, es mejor no usar java.util.Date en absoluto.