Как преобразовать java.util.Date в java.sql.Date? - PullRequest
417 голосов
/ 10 февраля 2009

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

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

Ответы [ 17 ]

460 голосов
/ 10 февраля 2009

Nevermind ....

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

59 голосов
/ 06 июля 2015

ТЛ; др

Как конвертировать java.util.Date в java.sql.Date?

Не. Оба класса устарели.

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

Пример запроса с 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.
)

Замены:

  • Instant вместо java.util.Date
    Оба представляют момент в UTC. но теперь с наносекундами вместо миллисекунд.
  • LocalDate вместо java.sql.Date
    Оба представляют значение только для даты без времени суток и без часового пояса.

Подробнее

Если вы пытаетесь работать со значениями только по дате (без времени суток, без часового пояса), используйте класс LocalDate вместо java.util.Date .

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

java.time

В Java 8 и более поздних версиях новые устаревшие классы java.time вытеснили неприятные старые классы даты и времени, связанные с ранними версиями Java. См. Oracle Tutorial . Большая часть функциональности была перенесена в Java 6 & 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP .

A Тип данных SQL DATE предназначен только для даты, без времени суток и часового пояса. У Java никогда не было именно такого класса † до java.time.LocalDate в Java 8. Давайте создадим такое значение, получая сегодняшнюю дату в соответствии с конкретным часовым поясом (часовой пояс важен при определении даты как нового дня) Например, в Париже рассветает раньше, чем в Монреале.

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".

На данный момент, мы можем сделать. Если ваш драйвер JDBC соответствует спецификации JDBC 4.2 , вы сможете передавать LocalDate через setObject на PreparedStatement для хранения в поле SQL DATE.

myPreparedStatement.setObject( 1 , localDate );

Аналогично, используйте ResultSet::getObject для извлечения из столбца SQL DATE в объект Java LocalDate. Указание класса во втором аргументе делает ваш код type-safe .

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

Другими словами, весь этот Вопрос не имеет отношения к JDBC 4.2 или более поздней версии.

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

Конвертировать в java.sql.Date

Для преобразования используйте новые методы, добавленные к старым классам даты и времени. Мы можем позвонить java.sql.Date.valueOf(…), чтобы преобразовать LocalDate.

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

И идет в другом направлении.

LocalDate localDate = sqlDate.toLocalDate();

Преобразование из java.util.Date

Хотя вам следует избегать использования старых классов даты и времени, вас могут заставить работать с существующим кодом. Если это так, вы можете конвертировать в / из java.time.

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

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

Instant instant = myUtilDate.toInstant();

Чтобы определить дату, нам нужен контекст часового пояса. В любой момент времени дата меняется по всему земному шару в зависимости от часового пояса. Примените ZoneId, чтобы получить 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.

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

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

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

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

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

38 голосов
/ 04 ноября 2010

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

Я предлагаю:

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);
23 голосов
/ 06 февраля 2014

Эта функция возвращает преобразованную дату SQL из объекта даты Java.

public java.sql.Date convertJavaDateToSqlDate(java.util.Date date) {
    return new java.sql.Date(date.getTime());
}
18 голосов
/ 06 июля 2015

Преобразование java.util.Data в java.sql.Data приведет к потере часа, минуты и секунды. Поэтому, если это возможно, я предлагаю вам использовать java.sql.Timestamp, например:

prepareStatement.setTimestamp(1, new Timestamp(utilDate.getTime()));

Для получения дополнительной информации, вы можете проверить этот вопрос .

12 голосов
/ 09 сентября 2016

В моем случае выбор даты из JXDatePicker (java calender) и сохранение ее в базе данных как тип даты SQL, ниже работает нормально.

java.sql.Date date = new java.sql.Date(pickedDate.getDate().getTime());

где selectedDate - это объект JXDatePicker

5 голосов
/ 23 декабря 2014

Эта функция возвращает преобразованную дату SQL из объекта даты Java.

public static java.sql.Date convertFromJAVADateToSQLDate(
            java.util.Date javaDate) {
        java.sql.Date sqlDate = null;
        if (javaDate != null) {
            sqlDate = new Date(javaDate.getTime());
        }
        return sqlDate;
    }
3 голосов
/ 16 февраля 2016

Отформатируйте ваш java.util.Date первым. Затем используйте форматированную дату, чтобы получить дату в java.sql.Date

java.util.Date utilDate = "Your date"
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
final String stringDate= dateFormat.format(utilDate);
final java.sql.Date sqlDate=  java.sql.Date.valueOf(stringDate);
2 голосов
/ 27 июня 2016

Я новичок: после долгих бегов это сработало. Мысль может быть полезна

     String bufDt =  bDOB.getText();  //data from form
     DateFormat dF = new SimpleDateFormat("dd-MM-yyyy"); //data in form is in this format
     Date bbdt = (Date)dF.parse(bufDt);  // string data is converted into java util date
     DateFormat dsF = new SimpleDateFormat("yyyy-MM-dd"); //converted date is reformatted for conversion to sql.date
     String ndt = dsF.format(bbdt); // java util date is converted to compatible java sql date
     java.sql.Date sqlDate=  java.sql.Date.valueOf(ndt);  // finally data from the form is convered to java sql. date for placing in database
2 голосов
/ 24 сентября 2013

Вот пример преобразования Util Date в Sql date, и да, это один пример того, что я использую в своем проекте, может быть полезно и вам.

java.util.Date utilStartDate = table_Login.getDob();(orwhat ever date your give form obj)
java.sql.Date sqlStartDate = new java.sql.Date(utilStartDate.getTime());(converting date)
...