Ответ 1
Я нашел ответ:
Timestamp timestamp = new Timestamp(var2.getXMLGregorianCalendar().toGregorianCalendar().getTimeInMillis());
var1.setTimeStamp(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
Любые идеи..? Спасибо!
Я нашел ответ:
Timestamp timestamp = new Timestamp(var2.getXMLGregorianCalendar().toGregorianCalendar().getTimeInMillis());
var1.setTimeStamp(timestamp);
Старайтесь избегать устаревших классов времени. Но если передан 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 ) ;
FYI, ужасно трудные старые классы времени были вытеснены классами java.time.
javax.xml.datatype.XMLGregorianCalendar
заменяется на java.time.ZonedDateTime
.java.util.GregorianCalendar
заменяется на java.time.ZonedDateTime
. Обратите внимание на новые методы преобразования, добавленные в старый класс.java.sql.Timestamp
заменяется на java.time.Instant
, оба представляют момент в UTC с разрешением наносекунды. Избегайте использования 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 8 и более поздние версии. Эти классы вытесняют неприятные старые устаревшие классы времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Проект Joda-Time, теперь в режиме обслуживания, советует перейти на классы java.time.
Чтобы узнать больше, ознакомьтесь с учебным пособием Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация - JSR 310.
Вы можете обменивать объекты java.time непосредственно с вашей базой данных. Используйте JDBC-драйвер, совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в java.sql.*
.
Где можно получить классы java.time?
Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и другие.