преобразование XMLGregorianCalendar в java.язык SQL.Отметка времени

Я пытаюсь назначить дату XMLGregorianCalendar java.язык SQL.Временная метка var, вот так...

var1.setTimeStamp(Timestamp.valueOf(var2.getXMLGregorianCalendar().toString()))

но, видимо, это не работает, и выдает исключение...

java.ленг.IllegalArgumentException: формат даты должен быть гггг-ММ-ДД чч:мм:СС[.fffffffff]

и я пробовал это, а также:

var1.setTimeStamp((Timestamp) var2.getXMLGregorianCalendar().getTime())

но...

java.ленг.ClassCastException: java.утиль.Дата не может быть приведена к Ява.язык SQL.Метка

любые идеи..? Спасибо!

2 ответов


Я нашел ответ:

    Timestamp timestamp = new Timestamp(var2.getXMLGregorianCalendar().toGregorianCalendar().getTimeInMillis());
    var1.setTimeStamp(timestamp);

tl; dr

старайтесь избегать устаревших классов даты и времени. Но если вручить javax.xml.datatype.XMLGregorianCalendar, преобразовать в modern java.time.Instant класса. Не нужно использовать java.sql.Timestamp.

myPreparedStatement.setObject( 
    … , 
    myXMLGregorianCalendar  // If forced to work with a `javax.xml.datatype.XMLGregorianCalendar` object rather than a modern java.time class…
    .toGregorianCalendar()  // …convert to a `java.util.GregorianCalendar`, and then…
    .toZonedDateTime()      // …convert to modern `java.time.ZonedDateTime` class.
    .toInstant()            // Adjust to UTC by extracting an `Instant` object.
)

извлечение из базы данных, начиная с JDBC 4.2 и позднее.

Instant instant = myResultSet.getObject( … , Instant.class ) ;

java.время

к вашему сведению, ужасно хлопотные старые классы даты-времени были вытеснены java.время классы.

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

java.util.GregorianCalendar gc = myXMLGregorianCalendar.toGregorianCalendar() ;

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

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