java.util.Date vs java.sql.Date

1. Pregled

U ovom uputstvu usporedit ćemo dvije klase datuma: java.util.Datum i java.sql.Date.

Kad završimo usporedbu, trebalo bi biti jasno koju i zašto koristiti.

2. java.util.Datum

The java.util.Datum klasa predstavlja određeni trenutak u vremenu, s milisekundnom preciznošću od 1. siječnja 1970. 00:00:00 GMT (epoha). Predavanje se koristi za zadržavanje koordiniranog univerzalnog vremena (UTC).

Možemo ga inicijalizirati na dva načina.

Pozivanjem konstruktora:

Datum datuma = novi datum ();

koji će stvoriti novi datum objekt s vremenom podešenim na trenutno vrijeme, izmjereno na najbližu milisekundu.

Ili prolaskom određenog broja milisekundi od epohe:

duga vremenska oznaka = 1532516399000; // 25. srpnja 2018. 10:59:59 UTC Datum datuma = novi datum (vremenska oznaka);

Napomenimo da su drugi konstruktori, prisutni prije Jave 8, sada zastarjeli.

Međutim, Datum ima niz problema i općenito se više ne preporučuje njegova upotreba.

Promjenjivo je. Jednom kad ga inicijaliziramo, možemo promijeniti njegovu unutarnju vrijednost. Na primjer, možemo nazvati Postavi vrijeme metoda:

date.setTime (0); // 01. siječnja 1970 00:00:00

Da biste saznali više o prednostima nepromjenjivih objekata, pogledajte ovaj članak: Nepromjenjivi objekti u Javi.

Također ne podnosi sve datume baš najbolje. Tehnički bi trebao odražavati koordinirano univerzalno vrijeme (UTC). Međutim, to ovisi o operativnom sustavu host okruženja.

Većina modernih operativnih sustava koristi 1 dan = 24h x 60m x 60s = 86400 sekundi, što, kao što vidimo, ne uzima u obzir "prestupnu sekundu".

Uvođenjem Jave 8, java.vrijeme treba koristiti paket. Prije Jave 8 bilo je dostupno alternativno rješenje - Joda Vrijeme.

3. java.sql.Datum

The java.sql.Date proteže se java.util.Datum razred.

Njegova glavna svrha je predstavljati SQL DATUM koji čuva godine, mjesece i dane. Podaci o vremenu se ne čuvaju.

Zapravo, datum je pohranjen u milisekundama od 1. siječnja 1970. 00:00:00 GMT, a vremenski dio je normaliziran, tj. Postavljen na nulu.

U osnovi, to je omot java.util.Datum koji rješava specifične SQL zahtjeve. java.sql.Date treba koristiti samo kada se radi s bazama podataka.

Međutim, kao java.sql.Date ne sadrži podatke o vremenskoj zoni, pretvorba vremenske zone između našeg lokalnog okruženja i poslužitelja baze podataka ovisi o implementaciji JDBC pokretačkog programa. To dodaje novu razinu složenosti.

Na kraju, napomenimo, kako bismo podržali druge SQL vrste podataka: SQL TIME i SQL TIMESTAMP, dvije druge java.sql dostupni su tečajevi: Vrijeme i Vremenska oznaka.

Ovo drugo, iako se proteže od java.util.Datum, podržava nanosekunde.

4. Zaključak

Razred java.util.Datum pohranjuje vrijednost datuma i vremena u milisekundama od epohe. java.sql.Date pohranjuje vrijednost samo za datum i obično se koristi u JDBC.

Rukovanje datumima je nezgodno. Moramo se sjetiti posebnih slučajeva: prijestupne sekunde, različite vremenske zone itd. Kad se bavimo JDBC-om, možemo se koristiti java.sql.Date s oprezom.

Ako ćemo se koristiti java.util.Date, moramo se sjetiti njegovih nedostataka. Ako koristite Javu 8, onda je bolje ne koristiti java.util.Datum uopće.