преобразование 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.время классы.
-
javax.xml.datatype.XMLGregorianCalendar
заменить наjava.time.ZonedDateTime
. -
java.util.GregorianCalendar
заменить наjava.time.ZonedDateTime
. Примечание новые методы преобразования добавляется в старый класс. -
java.sql.Timestamp
заменить наjava.time.Instant
, оба представляют момент в UTC с разрешением наносекунд.
избегайте использования 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
- более поздние версии Android bundle реализации java.время классы.
- для более раннего Android (ThreeTenABP проект приспосабливается ThreeTen-Backport (упоминается выше.) См.как использовать ThreeTenABP....
на ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательной площадкой для возможных будущих дополнений к java.время. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и больше.