java.util.Date vs java.sql.Date

java.util.Date vs java.sql.Date

**

1. обзор

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

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

2. java.util.Dateс

The java.util.Date class represents a particular moment in time, with millisecond precision since the 1st of January 1970 00:00:00 GMT (the epoch time). Класс используется для хранения всемирного скоординированного времени (UTC).

Мы можем инициализировать его двумя способами.

Вызывая конструктор:

Date date = new Date();

который создаст новый объектdate со временем, установленным на текущее время с точностью до миллисекунды.

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

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

Обратите внимание, что другие конструкторы, представленные до Java 8, теперь устарели.

ОднакоDate has a number of issues and overall its usage isn’t recommended anymore.

Это изменчиво. Как только мы инициализируем его, мы можем изменить его внутреннее значение. Например, мы можем вызвать методsetTime:

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

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

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

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

With the introduction of Java 8, java.time package should be used. До Java 8 было доступно альтернативное решение -Joda Time.

3. java.sql.Date

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.

**