Рубрики
Без рубрики

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

Узнайте о различиях между java.util.Дата и java.sql.Дата.

Автор оригинала: baeldung.

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.Дата вообще.