Как преобразовать 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.Date | java.time.Instant | java.util.Date.toInstant() java.util.Date.from( Instant ) |
java.sql.Date | java.time.LocalDate | java.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 ofjava.util.Date
Both represent a moment in UTC. but now with nanoseconds instead of milliseconds.LocalDate
instead ofjava.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
.
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 SE 8, Java SE 9, Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с комплексной реализацией.
- Java 9 содержит некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Большая часть функций java.time перенесена обратно на Java 6 и 7 через ThreeTen-Backport.
- Android
- Более поздние версии Android (26+) содержат реализации классов java.time.
- Для более ранних версий Android (<26) процесс, известный как десугаринг API, предоставляет подмножество функций java.time, изначально не встроенных в Android.
- Если десугаринг не предлагает того, что вам нужно, проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше) для Android. Смотрите Как использовать ThreeTenABP ....
Проект 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());
}