Вопрос-ответ

How to convert java.util.Date to java.sql.Date?

Как преобразовать java.util.Date в java.sql.Date?

Я пытаюсь использовать java.util.Date в качестве входных данных, а затем создаю запрос с его помощью - поэтому мне нужен java.sql.Date.

Я был удивлен, обнаружив, что он не может выполнить преобразование неявно или явно - но я даже не знаю, как бы я это сделал, поскольку Java API все еще довольно новый для меня.

Переведено автоматически
Ответ 1

Неважно....

public class MainClass {

public static void main(String[] args) {
java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
System.out.println("utilDate:" + utilDate);
System.out.println("sqlDate:" + sqlDate);

}

}

объясняет это. Ссылка http://www.java2s.com/Tutorial/Java/0040__Data-Type/ConvertfromajavautilDateObjecttoajavasqlDateObject.htm

Ответ 2

tl;dr


Как преобразовать java.util.Date в java.sql.Date?


Не нужно.

Оба Date класса устарели. Sun, Oracle и сообщество JCP отказались от этих устаревших классов даты и времени много лет назад, единогласно приняв JSR 310, определяющий классы java.time.


  • Используйте классы java.time вместо устаревших java.util.Date & java.sql.Date с JDBC 4.2 или более поздней версии.

  • Преобразовать в / из java.time, если взаимодействие с кодом еще не обновлено до java.time.






















НаследиеСовременныеПреобразование
java.util.Datejava.time.Instantjava.util.Date.toInstant()
java.util.Date.from( Instant )
java.sql.Datejava.time.LocalDatejava.sql.Date.toLocalDate()
java.sql.Date.valueOf( LocalDate )

Пример запроса с PreparedStatement.

myPreparedStatement.setObject( 
… , // Specify the ordinal number of which argument in SQL statement.
myJavaUtilDate.toInstant() // Convert from legacy class `java.util.Date` (a moment in UTC) to a modern `java.time.Instant` (a moment in UTC).
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Adjust from UTC to a particular time zone, to determine a date. Instantiating a `ZonedDateTime`.
.toLocalDate() // Extract a date-only `java.time.LocalDate` object from the date-time `ZonedDateTime` object.
)

Replacements:


  • Instant instead of java.util.Date
    Both represent a moment in UTC. but now with nanoseconds instead of milliseconds.

  • LocalDate instead of java.sql.Date
    Both represent a date-only value without a time of day and without a time zone.

Details

If you are trying to work with date-only values (no time-of-day, no time zone), use the LocalDate class rather than java.util.Date.

Table of date-time types in Java (both legacy and modern) and in the SQL standard.

java.time

In Java 8 and later, the troublesome old date-time classes bundled with early versions of Java have been supplanted by the new java.time package. See Oracle Tutorial. Much of the functionality has been back-ported to Java 6 & 7 in ThreeTen-Backport and further adapted to Android in ThreeTenABP.

A SQL data type DATE is meant to be date-only, with no time-of-day and no time zone. Java never had precisely such a class† until java.time.LocalDate in Java 8. Let's create such a value by getting today's date according to a particular time zone (time zone is important in determining a date as a new day dawns earlier in Paris than in Montréal, for example).

LocalDate todayLocalDate = LocalDate.now( ZoneId.of( "America/Montreal" ) );  // Use proper "continent/region" time zone names; never use 3-4 letter codes like "EST" or "IST".

At this point, we may be done. If your JDBC driver complies with JDBC 4.2 spec, you should be able to pass a LocalDate via setObject on a PreparedStatement to store into a SQL DATE field.

myPreparedStatement.setObject( 1 , localDate );

Likewise, use ResultSet::getObject to fetch from a SQL DATE column to a Java LocalDate object. Specifying the class in the second argument makes your code type-safe.

LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class );

In other words, this entire Question is irrelevant under JDBC 4.2 or later.

If your JDBC driver does not perform in this manner, you need to fall back to converting to the java.sql types.

Convert to java.sql.Date

To convert, use new methods added to the old date-time classes. We can call java.sql.Date.valueOf(…) to convert a LocalDate.

java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );

And going the other direction.

LocalDate localDate = sqlDate.toLocalDate();

Converting from java.util.Date

While you should avoid using the old date-time classes, you may be forced to when working with existing code. If so, you can convert to/from java.time.

Перейдите к Instant классу, который представляет момент на временной шкале в UTC. An Instant похож по идее на a java.util.Date. Но обратите внимание, что Instant имеет разрешение до наносекунд, в то время как java.util.Date имеет разрешение всего миллисекунд.

Для преобразования используйте новые методы, добавленные в старые классы. Например, java.util.Date.from( Instant ) и java.util.Date::toInstant.

Instant instant = myUtilDate.toInstant();

Чтобы определить дату, нам нужен контекст часового пояса. Для любого данного момента дата варьируется по всему миру в зависимости от часового пояса. Примените a ZoneId, чтобы получить a ZonedDateTime.

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();

† Класс java.sql.Date выдает себя за класс только для даты без указания времени суток, но на самом деле делает указание времени суток с поправкой на полночь. Сбивает с толку? Да, старые классы даты и времени представляют собой беспорядок.


О java.time

Платформа java.time встроена в Java 8 и более поздние версии. Эти классы заменяют старые, вызывающие беспокойство, устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Чтобы узнать больше, ознакомьтесь с Руководством по Oracle. И найдите в Stack Overflow множество примеров и пояснений. Спецификация - JSR 310.

Проект Joda-Time, который сейчас находится в режиме обслуживания, рекомендует перейти на классы java.time.

Вы можете обмениваться объектами java.time непосредственно со своей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.* классах. Поддержка Hibernate 5 и JPA 2.2 java.time.

Где получить классы java.time?

Таблица, какую библиотеку java.time использовать с какой версией Java или Android

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

Ответ 3

При другом ответе у вас могут возникнуть проблемы с информацией о времени (сравните даты с неожиданными результатами!)

Я предлагаю:

java.util.Calendar cal = Calendar.getInstance();
java.util.Date utilDate = new java.util.Date(); // your util date
cal.setTime(utilDate);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
java.sql.Date sqlDate = new java.sql.Date(cal.getTime().getTime()); // your sql date
System.out.println("utilDate:" + utilDate);
System.out.println("sqlDate:" + sqlDate);
Ответ 4

Эта функция вернет преобразованную SQL-дату из объекта java date.

public java.sql.Date convertJavaDateToSqlDate(java.util.Date date) {
return new java.sql.Date(date.getTime());
}
java sql date