java.util.Date versus java.sql.Date

1. Overzicht

In deze tutorial gaan we twee datumklassen vergelijken: java.util.Date en java.sql.Datum.

Zodra we de vergelijking hebben voltooid, moet het duidelijk zijn welke we moeten gebruiken en waarom.

2. java.util.Date

De java.util.Date klasse vertegenwoordigt een bepaald moment in de tijd, met milliseconde precisie sinds 1 januari 1970 00:00:00 GMT (de epoch tijd). De klasse wordt gebruikt om gecoördineerde universele tijd (UTC) te behouden.

We kunnen het op twee manieren initialiseren.

Door de constructor aan te roepen:

Datum datum = nieuwe datum ();

waardoor een nieuw datum object met tijd ingesteld op de huidige tijd, gemeten tot op de dichtstbijzijnde milliseconde.

Of door een aantal milliseconden te passeren sinds het tijdperk:

lange tijdstempel = 1532516399000; // 25 juli 2018 10:59:59 UTC Datum datum = nieuwe datum (tijdstempel);

Laten we opmerken dat andere constructors die vóór Java 8 aanwezig waren, nu verouderd zijn.

Echter, Datum heeft een aantal problemen en over het algemeen wordt het gebruik ervan niet meer aanbevolen.

Het is veranderlijk. Zodra we het hebben geïnitialiseerd, kunnen we de interne waarde ervan wijzigen. We kunnen bijvoorbeeld de tijd instellen methode:

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

Lees dit artikel voor meer informatie over de voordelen van onveranderlijke objecten: Onveranderlijke objecten in Java.

Het kan ook niet alle datums goed verwerken. Technisch gezien moet het de gecoördineerde universele tijd (UTC) weerspiegelen. Dat hangt echter af van het besturingssysteem van de hostomgeving.

De meeste moderne besturingssystemen gebruiken 1 dag = 24h x 60m x 60s = 86400 seconden, wat, zoals we kunnen zien, geen rekening houdt met de "schrikkelseconde".

Met de introductie van Java 8, java.time pakket moet worden gebruikt. Vóór Java 8 was er een alternatieve oplossing beschikbaar - Joda-tijd.

3. java.sql.Date

De java.sql.Datum strekt zich uit java.util.Date klasse.

Het belangrijkste doel is om SQL DATE weer te geven, die jaren, maanden en dagen bijhoudt. Er worden geen tijdgegevens bewaard.

In feite wordt de datum opgeslagen in milliseconden sinds 1 januari 1970 00:00:00 GMT en wordt het tijdsgedeelte genormaliseerd, d.w.z. ingesteld op nul.

Kortom, het is een omslag java.util.Date die SQL-specifieke vereisten afhandelt. java.sql.Datum mag alleen worden gebruikt bij het omgaan met databases.

Echter, zoals java.sql.Datum bevat geen tijdzone-informatie, de tijdzoneconversie tussen onze lokale omgeving en databaseserver is afhankelijk van een implementatie van een JDBC-stuurprogramma. Dit voegt een ander niveau van complexiteit toe.

Laten we tot slot opmerken, om andere SQL-gegevenstypen te ondersteunen: SQL TIME en SQL TIMESTAMP, twee andere java.sql lessen zijn beschikbaar: Tijd en Tijdstempel.

Dat laatste, ook al strekt zich uit van java.util.Date, ondersteunt nanoseconden.

4. Conclusie

Klasse java.util.Date slaat een datum-tijdwaarde op in milliseconden sinds de epoch. java.sql.Datum slaat alleen een datumwaarde op en wordt vaak gebruikt in JDBC.

Het omgaan met datums is lastig. We moeten onthouden over speciale gevallen: schrikkelseconden, verschillende tijdzones enz. Bij het omgaan met JDBC kunnen we gebruiken java.sql.Datum met de nodige voorzichtigheid.

Als we gaan gebruiken java.util.Date, we moeten ons de tekortkomingen ervan herinneren. Als u Java 8 gebruikt, kunt u het beter niet gebruiken java.util.Date helemaal.