java.util.Date vs java.sql.Date

1. Oversigt

I denne vejledning skal vi sammenligne to dataklasser: java.util.Date og java.sql.dato.

Når vi har gennemført sammenligningen, skal det være klart, hvilken der skal bruges, og hvorfor.

2. java.util.Date

Det java.util.Date klasse repræsenterer et bestemt tidspunkt i tiden med millisekundpræcision siden 1. januar 1970 00:00:00 GMT (epoken). Klassen bruges til at holde koordineret universel tid (UTC).

Vi kan initialisere det på to måder.

Ved at ringe til konstruktøren:

Dato dato = ny dato ();

som vil skabe et nyt dato objekt med tiden indstillet til den aktuelle tid målt til nærmeste millisekund.

Eller ved at passere et antal millisekunder siden epoken:

lang tidsstempel = 1532516399000; // 25. juli 2018 10:59:59 UTC Dato dato = ny dato (tidsstempel);

Lad os bemærke, at andre konstruktører, der er til stede før Java 8, er udfaset nu.

Imidlertid, Dato har en række problemer, og brugen af ​​dets anvendelse anbefales generelt ikke længere.

Det kan ændres. Når vi først har initialiseret det, kan vi ændre dets interne værdi. For eksempel kan vi kalde fastsat tidspunkt metode:

date.setTime (0); // 1. januar 1970 00:00:00

For at lære mere om fordelene ved uforanderlige objekter, se denne artikel: Uforanderlige objekter i Java.

Det håndterer heller ikke alle datoer meget godt. Teknisk set skal den afspejle koordineret universel tid (UTC). Det afhænger dog af et operativsystem i værtsmiljøet.

De fleste moderne operativsystemer bruger 1 dag = 24h x 60m x 60s = 86400 sekunder, som som vi kan se ikke tager ”spring sekund” i betragtning.

Med introduktionen af ​​Java 8, java.tid pakken skal bruges. Før Java 8 var der en alternativ løsning tilgængelig - Joda Time.

3. java.sql.Date

Det java.sql.dato strækker sig java.util.Date klasse.

Dens hovedformål er at repræsentere SQL DATE, som holder år, måneder og dage. Ingen tidsdata opbevares.

Faktisk er datoen gemt som millisekunder siden 1. januar 1970 00:00:00 GMT, og tidsdelen er normaliseret, dvs. sat til nul.

Dybest set er det en indpakning java.util.Date der håndterer SQL-specifikke krav. java.sql.dato bør kun bruges, når der behandles databaser.

Imidlertid, som java.sql.dato ikke indeholder tidszoneoplysninger, tidszonekonvertering mellem vores lokale miljø og databaseserver afhænger af en implementering af JDBC-driveren. Dette tilføjer endnu et niveau af kompleksitet.

Endelig, lad os bemærke, for at understøtte andre SQL-datatyper: SQL TIME og SQL TIMESTAMP, to andre java.sql klasser er tilgængelige: Tid og Tidsstempel.

Sidstnævnte, selvom det strækker sig fra java.util.Date, understøtter nanosekunder.

4. Konklusion

Klasse java.util.Date gemmer en dato-tidsværdi som millisekunder siden epoken. java.sql.dato gemmer kun en datoværdi og bruges ofte i JDBC.

Håndtering af datoer er vanskelig. Vi er nødt til at huske på specielle tilfælde: spring sekunder, forskellige tidszoner osv. Når vi beskæftiger os med JDBC, kan vi bruge java.sql.dato med forsigtighed.

Hvis vi skal bruge java.util.Date, vi er nødt til at huske på dens mangler. Hvis du bruger Java 8, er det bedre at ikke bruge det java.util.Date overhovedet.