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

Я пытаюсь назначить дату XMLGregorianCalendar для java.sql.Timestamp var, как это...

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

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

java.lang.IllegalArgumentException: формат временной отметки должен быть yyyy-mm-dd hh: mm: ss [.fffffffff]

И я тоже пробовал это:

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

но...

java.lang.ClassCastException: java.util.Date не может быть добавлено в java.sql.Timestamp

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

Ответ 1

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

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

Ответ 2

ТЛ; др

Старайтесь избегать устаревших классов времени. Но если передан javax.xml.datatype.XMLGregorianCalendar, конвертируйте в современный 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.time

FYI, ужасно трудные старые классы времени были вытеснены классами java.time.

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

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

Теперь используйте новый удобный метод конверсии, добавленный в старый класс GregorianCalendar, чтобы получить современный объект java.time.ZonedDateTime.

ZonedDateTime zdt = gc.toZonedDateTime() ;  // Convert from legacy class to modern class.

Отрегулируйте этот часовой пояс в UTC. Извлеките Instant объект, который является моментом всегда в UTC, по определению.

Instant instant = zdt.toInstant() ;  // Adjust from some time zone to UTC.

Начиная с JDBC 4.2, мы можем напрямую обменивать объекты java.time с базой данных. Поэтому не нужно снова прикоснуться к java.sql.Timestamp снова.

myPreparedStatement.setObject( … , instant ) ;

индексирование:

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

О java.time

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

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

Чтобы узнать больше, ознакомьтесь с учебным пособием Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация - 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 и другие.