Выбор между java.утиль.Дата или java.язык SQL.Дата

должен ли я использовать java.утиль.Дата или java.язык SQL.Дата?

У меня есть база данных VisualFox, и я получил сущности с помощью мастера идей IntelliJ, используя драйвер appropiate JDBC type 4.

ide (или драйвер) создал поля даты в качестве метки времени. Однако поля даты - это не метки времени, а поля даты, в них хранятся только год, месяц и день.

поэтому я задаюсь вопросом, должен ли я переключиться на java.утиль.Дата или java.язык SQL.Дата. На первый взгляд я думал это Ява.язык SQL.Дата должна быть подходящей, но у нее есть много методов, объявленных устаревшими.

4 ответов


tl; dr

должен ли я использовать java.утиль.Дата или java.язык SQL.Дата?

ни.

оба устарели с JDBC 4.2 и более поздних. Использовать java.время классы.

  • значение только для даты
    для типа базы данных сродни SQL-standard DATE используйте java.time.LocalDate.
    • LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
    • myPreparedStatement.setObject( ld , … ) ;
  • дата с временем суток в формате UTC
    для типа базы данных сродни SQL-standard TIMESTAMP WITH TIME ZONE используйте java.time.Instant.
    • Instant instant = myResultSet.getObject( … , Instant.class ) ;
    • myPreparedStatement.setObject( instant , … ) ;

подробности

вопрос и другие ответы, похоже, обдумывал вопрос. A java.язык SQL.Дата - это просто java.утиль.Дата со своим временем установленным в 00:00:00.

С java.язык SQL.Дата док (Курсив мой)...

Дата Класс

java.ленг.Объект

java.утиль.Дата ← наследуется от j.u.Дата

java.язык SQL.Дата

...

тонкая обертка вокруг значения миллисекунды, которое позволяет JDBC определите это как значение даты SQL. Значение миллисекунд представляет собой количество миллисекунд, прошедших с 1 января 1970 года 00:00: 00.000 GMT.   Time время суток установлено на ноль, полночь GMT / UTC

чтобы соответствовать определению даты SQL, значения миллисекунды, обернутые java.язык SQL.Экземпляр Date должен быть "нормализован", установив часы, минуты, секунды и миллисекунды равными нулю в конкретном часовом поясе, с которым экземпляр связанный.

только дата и время

основные проблемы:

  • среда SQL
    в SQL,DATE тип данных хранит только дату, без времени суток.
  • JAVA
    в плохо спроектированной библиотеке даты и времени в комплекте с ранними версиями Java они не смогли включить класс для представления только даты.

вместо создания класса только для даты, Java-команды составила ужасный взлом. Они взяли свой класс даты и времени (неправильное название java.util.Date класс, содержащий обе даты и время) и расширил его, чтобы экземпляр установил свое время суток до полуночи UTC, 00:00:00. Этот хак, этот подкласс j.u.Дата, это java.sql.Date.

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

Для Использовать

так когда какую использовать? Просто после резки через заблуждения.

  • при чтении или записи в базе данных столбец только дата используйте java.sql.Date как он неуклюже пытается замаскировать свое время суток.
  • везде в Java, где вам нужно времени вместе с датой используйте java.util.Date.
  • когда у вас есть java.язык SQL.Дата в руке, но нужна java.утиль.Дата, просто передайте java.язык SQL.Дата. Как подкласс,java.язык SQL.Дата is java.утиль.Дата.

Еще Лучше

в современной Java теперь у вас есть выбор достойных библиотек даты и времени, чтобы заменить старую и, как известно, хлопотную java.утиль.Дата, календарь, SimpleTextFormat и java.язык SQL.Классы даты в комплекте с Java. Основные варианты:

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

A драйвер JDBC обновление до JDBC 4.2 или более поздней версии может использоваться для прямого обмена java.время объекты с базой данных. Тогда мы можем полностью отказаться от уродливый беспорядок, который является классами даты и времени в java.утиль.* и java.язык SQL.* пакеты.

setObject / getObject

в этой статье опубликовано Oracle объясняет, что JDBC в Java 8 был обновлен прозрачно для сопоставления SQL DATE значение для новой java.время.LocalDate введите, если вы вызываете getObject и setObject методы.

в туповатыми язык, дно спецификация обновления JDBC 4.2 подтверждает эту статью, с новые сопоставления добавлены в getObject и setObject методы.

myPreparedStatement.setObject( … , myLocalDate ) ;

...и...

LocalDate myLocalDate = myResultSet.getObject( … , LocalDate.class ) ;

преобразование

спецификация также говорит, что новые методы были добавлены к Java.язык SQL.Класс Date для преобразования туда и обратно в java.время.LocalDate.

Часовой Пояс

старый java.util.Date, java.sql.Date и java.sql.Timestamp всегда в UTC. Первые два (по крайней мере) имеют часовой пояс, похороненный глубоко в их исходном коде, но используется только под поверхностью, такой как equals метод, и не имеет геттер/сеттер.

больше, к сожалению, их toString методы применяют текущий часовой пояс JVM по умолчанию. Так наивному программисту это кажется как будто у них есть часовой пояс, но у них его нет.

и похороненный часовой пояс и toString поведение-две из многих причин, чтобы избежать этих неприятных старых классов наследия.

напишите свою бизнес-логику, используя java.время (Java 8 и более поздние версии). Где java.времени не хватает, используйте Joda Времени. Как в Java.время и Джода-время имеют удобные методы для перехода туда и обратно со старыми классами, где это необходимо.

замена:

на Instant класс представляет момент на временной шкале в UTC с разрешением наносекунд (до девять (9) цифр десятичной дробью).

все три java.time.Local… классы все лишены какой-либо концепции часовой пояс или смещение-от-UTC.


о java.время

на java.время framework встроен в Java 8 и более поздние версии. Эти классы вытесняют беспокойных старых наследие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

на Joda Времени, теперь режим обслуживания, советует миграция в java.время классы.

чтобы узнать больше, см. В Oracle Учебник. И search Stack Overflow для многих примеров и объяснений. Спецификация JSR 310.

вы можете обменять java.время объекты непосредственно с вашей базой данных. Используйте драйвер JDBC соответствуют JDBC 4.2 или позже. Нет необходимости в строках, нет необходимости в java.sql.* классы.

где получить java.время занятий?

  • Java SE 8, Java SE 9, Java SE 10, и позже
    • встроенный.
    • часть стандартного API Java со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • большая часть java.функциональность времени обратно портирована на Java 6 & 7 в ThreeTen-Backport.
  • Android
    • более поздние версии Android bundle реализации java.классы время.
    • для более раннего Android (ThreeTenABP проект приспосабливается ThreeTen-Backport (упоминалось выше). Видеть как использовать ThreeTenABP....

на ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательной площадкой для возможных будущих дополнений к java.время. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и больше.


В общем, я считаю целесообразным использовать java.util.Date, Так как вы можете использовать его в любом месте вашей программы без преобразования типа или загрязнения вашего приложения SQL-кодом.

Я не знаю сценария, где ' java.язык SQL.Свидание было бы лучше.


ну, по этой статьи можно использовать javax.sql.Date без @Temporal аннотация, которая может сохранить некоторую кодировку от вас. Однако java.util.Date легче использовать во всем вашем приложении.

поэтому я бы использовал

@Column(name = "date")
@Temporal(TemporalType.DATE)
private java.util.Date date;

согласно Java doc, предлагается использовать соответствующий тип даты в соответствии с базовой базой данных. Однако, с Java 8, богатый набор классов под java.пакет time был предоставлен, и он должен использоваться, если приложение написано С Java 8.

класс javaxjava.язык SQL.Дата расширяет java.утиль.Дата с незначительными изменениями для контейнера миллисекунд, чтобы он мог эффективно поддерживать тип даты базы данных. Это, мы можем сохранить @ Temporal аннотацию, набрав из сущности класс.

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