Перейти к основному содержимому

java.util.Date против java.sql.Date

· 3 мин. чтения

1. Обзор

В этом руководстве мы собираемся сравнить два класса даты: java.util.Date и java.sql.Date .

Как только мы завершим сравнение, должно быть ясно, какой из них использовать и почему.

2. java.util.Дата

Класс java.util.Date представляет конкретный момент времени с точностью до миллисекунды с 00:00:00 по Гринвичу 1 января 1970 года (время эпохи) . Класс используется для хранения всемирного координированного времени (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

Чтобы узнать больше о преимуществах неизменяемых объектов, ознакомьтесь с этой статьей: Immutable Objects in Java .

Он также не очень хорошо обрабатывает все даты. Технически он должен отражать всемирное координированное время (UTC). Однако это зависит от операционной системы хост-среды.

Большинство современных операционных систем используют 1 день = 24 часа x 60 минут x 60 секунд = 86400 секунд, что, как мы видим, не учитывает «високосную секунду».

С введением Java 8 следует использовать пакет java.time . До Java 8 было доступно альтернативное решение — Joda Time .

3. java.sql.Дата

java.sql.Date расширяет класс java.util.Date .

Его основная цель — представлять SQL DATE, в котором хранятся годы, месяцы и дни. Данные о времени не сохраняются.

На самом деле дата хранится в миллисекундах с 1 января 1970 года 00:00:00 по Гринвичу, а временная часть нормализована, т.е. обнуляется.

По сути, это оболочка вокруг 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 .