java.util.Date vs java.sql.Date
1. Prehľad
V tomto výučbe budeme porovnávať dve triedy dátumov: java.util.Date a java.sql.Date.
Po dokončení porovnania by malo byť jasné, ktorý z nich použiť a prečo.
2. java.util.Date
The java.util.Date trieda predstavuje konkrétny časový okamih s presnosťou na milisekundy od 1. januára 1970 00:00:00 GMT (epochálny čas). Trieda slúži na udržiavanie koordinovaného svetového času (UTC).
Môžeme to inicializovať dvoma spôsobmi.
Zavolaním konštruktéra:
Dátum dátum = nový Dátum ();
čím sa vytvorí nový dátum objekt s časom nastaveným na aktuálny čas, meraný na najbližšiu milisekundu.
Alebo prejdením niekoľkých milisekúnd od epochy:
dlhá časová pečiatka = 1532516399000; // 25. júla 2018 10:59:59 UTC Dátum dátum = nový Dátum (časová známka);
Upozorňujeme, že iné konštruktory, ktoré boli prítomné pred jazykom Java 8, sú teraz zastarané.
Avšak Dátum má množstvo problémov a celkovo sa jeho použitie už neodporúča.
Je premenlivý. Po jeho inicializácii môžeme zmeniť jeho vnútornú hodnotu. Napríklad môžeme nazvať nastavte čas metóda:
date.setTime (0); // 1. januára 1970 00:00:00
Ak sa chcete dozvedieť viac o výhodách nemenných objektov, prečítajte si tento článok: Nemenné objekty v Jave.
Rovnako veľmi dobre nespracuje všetky dátumy. Technicky by to malo odrážať koordinovaný svetový čas (UTC). Závisí to však od operačného systému hostiteľského prostredia.
Väčšina moderných operačných systémov používa 1 deň = 24h x 60m x 60s = 86400 sekúnd, čo, ako vidíme, neberie do úvahy „priestupok“.
So zavedením Java 8 java.time malo by sa použiť balenie. Pred jazykom Java 8 bolo k dispozícii alternatívne riešenie - Joda Time.
3. java.sql.Date
The java.sql.Date predlžuje java.util.Date trieda.
Jeho hlavným účelom je reprezentovať DÁTUM SQL, ktorý uchováva roky, mesiace a dni. Neuchovávajú sa žiadne časové údaje.
Dátum je v skutočnosti uložený v milisekundách od 1. januára 1970 00:00:00 GMT a časová časť je normalizovaná, t. J. Nastavená na nulu.
V podstate je to zavinovačka dookola java.util.Date ktorý zvláda špecifické požiadavky na SQL. java.sql.Date by sa mali používať iba pri práci s databázami.
Avšak ako java.sql.Date nedrží informácie o časovej zóne, prevod časovej zóny medzi našim lokálnym prostredím a databázovým serverom závisí od implementácie ovládača JDBC. To dodáva ďalšiu úroveň zložitosti.
Na záver si všimnime, že na podporu ďalších dátových typov SQL: SQL TIME a SQL TIMESTAMP, dva ďalšie java.sql triedy sú k dispozícii: Čas a Časová značka.
Ten druhý, aj keď siaha od java.util.Date, podporuje nanosekundy.
4. Záver
Trieda java.util.Date ukladá hodnotu dátumu a času ako milisekundy od epochy. java.sql.Date ukladá hodnotu iba pre dátum a bežne sa používa v JDBC.
Nakladanie s dátumami je zložité. Musíme si uvedomiť špeciálne prípady: skokové sekundy, rôzne časové pásma atď. Pri jednaní s JDBC môžeme použiť java.sql.Date opatrne.
Ak budeme používať java.util.Date, musíme si uvedomiť jeho nedostatky. Ak používate Java 8, potom radšej nepoužívajte java.util.Date vôbec.