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
.