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

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

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

Ответ 1

TL;DR

Как преобразовать 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, были заменены новым пакетом java.time. См. Учебное пособие по Oracle. Большая часть функциональности была перенесена на Java 6 & 7 в ThreeTen-Backport и дополнительно адаптированы для Android в ThreeTenABP.

Тип данных 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. Указание класса во втором аргументе делает ваш код безопасным с точки зрения типа.

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 и более поздние версии. Эти классы вытесняют проблемные старые legacy унаследованные классы даты и времени, такие как java.util.Date, Calendar и SimpleDateFormat.

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

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

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

Где взять классы java.time?

  • Java SE 8, Java SE 9, Java SE 10 и более поздние
    • Встроенный.
    • Часть стандартного Java API со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональности java.time перенесена на Java 6 & 7 в ThreeTen-Backport.
  • 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.

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

Ответ 5

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

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

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

Ответ 6

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

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

где selectedDate является объектом JXDatePicker

Ответ 7

Эта функция вернет преобразованную дату 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;
    }

Ответ 8

Сначала отформатируйте свой 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);

Ответ 9

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

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)

Ответ 10

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

     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

Ответ 11

Метод сравнения двух дат (util.date или sql.date)

 public static boolean isSameDay(Date a, Date b) {
    Calendar calA = new GregorianCalendar();
    calA.setTime(a);

    Calendar calB = new GregorianCalendar();
    calB.setTime(b);

    final int yearA = calA.get(Calendar.YEAR);
    final int monthA = calA.get(Calendar.MONTH);
    final int dayA = calA.get(Calendar.DAY_OF_YEAR);

    final int yearB = calB.get(Calendar.YEAR);
    final int monthB = calB.get(Calendar.MONTH);
    final int dayB = calB.get(Calendar.DAY_OF_YEAR);

    return yearA == yearB && monthA == monthB && dayA == dayB;
}

Ответ 12

java.sql.Date sqlDate = new java.sql.Date(javaDate.getTime());

Здесь javaDate является экземпляром java.util.Date.

Ответ 13

попробуйте с этим

public static String toMysqlDateStr(Date date) {
    String dateForMySql = "";
    if (date == null) {
        dateForMySql = null;
    } else {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        dateForMySql = sdf.format(date);
    }

    return dateForMySql;
}

Ответ 14

Я думаю, что лучший способ конвертировать:

static java.sql.Timestamp SQLDateTime(Long utilDate) {
    return new java.sql.Timestamp(utilDate);
}

Date date = new Date();
java.sql.Timestamp dt = SQLDateTime(date.getTime());

Если вы хотите вставить переменную dt в таблицу SQL, вы можете сделать:

insert into table (expireAt) values ('"+dt+"');

Ответ 15

Я использую следующий код, пожалуйста, попробуйте

DateFormat fm= new SimpleDateFormatter();

укажите формат даты, которую вы хотите например "DD-MM_YYYY" или 'YYYY-mm-dd', затем используйте тип данных java Date как

fm.format("object of java.util.date");

то он будет анализировать вашу дату

Ответ 16

Этот метод можно использовать для преобразования даты использования в дату sql,

DateUtilities.convertUtilDateToSql(java.util.Date)

Ответ 17

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

java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(utilDate);

Ответ 18

Если вы являетесь usgin Mysql, столбцу даты можно передать строковое представление этой даты

поэтому я использую класс DateFormatter для его форматирования, а затем устанавливаю его как строку в инструкции sql или подготовленный оператор

вот пример кода:

private String converUtilDateToSqlDate(java.util.Date utilDate) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String sqlDate = sdf.format(utilDate);
    return sqlDate;
}

Строка date = conversionUtilDateToSqlDate (otherTransaction.getTransDate());

//затем передайте эту дату в вашем заявлении sql