1. Обзор
В этом уроке мы сравним два класса date: java.util.Дата и java.sql.Дата .
Как только мы завершим сравнение, должно быть ясно, какой из них использовать и почему.
2. java.util.Date
java.util.Дата класс представляет определенный момент времени с точностью до миллисекунды с 1 января 1970 года 00:00:00 по Гринвичу (время эпохи) . Класс используется для сохранения координированного универсального времени (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 x 60m x секунд, что, как мы видим, не учитывает “високосную секунду”.
С введением Java 8 следует использовать java.time пакет . До Java 8 было доступно альтернативное решение – Joda Time .
3. java.sql.Дата
То То расширяться расширяться класс.
Его основная цель-представить дату SQL, которая хранит годы, месяцы и дни. Данные о времени не сохраняются.
Фактически, данные хранятся в миллисекундах с 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.Дата , поддерживает наносекунды.
4. Заключение
Класс java.util.Date сохраняет значение даты и времени в миллисекундах с момента начала эпохи. java.sql.Date хранит только значение даты и обычно используется в JDBC.
Обработка дат сложна. Нам нужно помнить об особых случаях: високосные секунды, разные часовые пояса и т. Д. При работе с JDBC мы можем использовать java.sql.Date с осторожностью.
Если мы собираемся использовать java.util.Дата, нам нужно помнить о ее недостатках. Если вы используете Java 8, то лучше не использовать java.util.Дата вообще.