java.util.Date срещу java.sql.Date

1. Общ преглед

В този урок ще сравним два класа на дати: java.util.Date и java.sql.Date .

След като завършим сравнението, трябва да стане ясно кой да използваме и защо.

2. java.util.Date

Класът java.util.Date представлява определен момент във времето, с милисекундна точност от 1 януари 1970 г. 00:00:00 GMT (епохата) . Класът се използва за поддържане на координирано универсално време (UTC).

Можем да го инициализираме по два начина.

Чрез извикване на конструктора:

Date date = new Date();

което ще създаде нов обект за дата с време, зададено на текущото време, измерено с точност до милисекунда.

Или чрез преминаване на брой милисекунди от епохата:

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

Нека да отбележим, че други конструктори, присъстващи преди Java 8, са оттеглени сега.

Въпреки това, Date има редица проблеми и като цяло използването му вече не се препоръчва .

Променя се. След като го инициализираме, можем да променим вътрешната му стойност. Например можем да извикаме метода setTime :

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

За да научите повече за предимствата на неизменяемите обекти, разгледайте тази статия: Неизменяеми обекти в Java.

Освен това не се справя много добре с всички дати. Технически тя трябва да отразява координирано универсално време (UTC). Това обаче зависи от операционната система на хост средата.

Повечето съвременни операционни системи използват 1 ден = 24h x 60m x 60s = 86400 секунди, което, както виждаме, не отчита „скоковата секунда“.

С въвеждането на Java 8 трябва да се използва пакет java.time . Преди Java 8 беше налично алтернативно решение - Joda Time .

3. java.sql.Date

В java.sql.Date простира java.util.Date клас.

Основната му цел е да представя SQL DATE, който съхранява години, месеци и дни. Не се съхраняват данни за времето.

Всъщност датата се съхранява в милисекунди от 1 януари 1970 г. 00:00:00 GMT и часовата част е нормализирана, т.е. зададена на нула.

По принцип това е обвивка около java.util.Date, която обработва специфични за SQL изисквания. java.sql.Date трябва да се използва само при работа с бази данни.

Тъй като обаче java.sql.Date не съдържа информация за часовите зони, преобразуването на часовата зона между нашата локална среда и сървъра на базата данни зависи от изпълнението на JDBC драйвер. Това добавя още едно ниво на сложност.

И накрая, нека да отбележим, че за да поддържаме други типове данни на SQL: SQL TIME и SQL TIMESTAMP, са налични два други класа на java.sql : Time и Timestamp .

Последният, въпреки че се простира от java.util.Date , поддържа наносекунди.

4. Заключение

Класът java.util.Date съхранява стойност дата-час като милисекунди от епохата. java.sql.Date съхранява стойност само за дата и се използва често в JDBC.

Работата с датите е трудна. Трябва да помним за специални случаи: високосни секунди, различни часови зони и т.н. При работа с JDBC можем да използваме java.sql.Date с повишено внимание.

Ако ще използваме java.util.Date, трябва да помним за неговите недостатъци. Ако използвате Java 8, тогава по-добре изобщо да не използвате java.util.Date .