преобразовать XMLGregorianCalendar в java.sql.Timestamp

Я пытаюсь назначить дату XMLGregorianCalendar переменной java.sql.Timestamp, например...

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

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


person elcadro    schedule 20.09.2012    source источник


Ответы (2)


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

    Timestamp timestamp = new Timestamp(var2.getXMLGregorianCalendar().toGregorianCalendar().getTimeInMillis());
    var1.setTimeStamp(timestamp);
person elcadro    schedule 20.09.2012

tl;dr

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

К вашему сведению, ужасно неприятные старые классы даты и времени были вытеснены классами 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. И поищите множество примеров и пояснений в Stack Overflow. Спецификация: JSR 310.

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

Где получить классы java.time?

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

person Basil Bourque    schedule 07.07.2018
comment
Пожалуйста, не добавляйте один и тот же ответ на несколько вопросов. Ответьте на лучший и пометьте остальные как дубликаты. См. раздел Можно ли добавлять повторяющиеся ответы на несколько вопросов? - person Machavity♦; 08.07.2018
comment
@Machavity Я подумал о том, чтобы пометить этот вопрос и другой вопрос того же автора как дубликаты. Но они не дубликаты. Этот спрашивает просто о переходе от XMLGregorianCalendar к java.sql.Timestamp классам. Другой спрашивает о несоответствии часового пояса в этом процессе. Мой другой ответ дает дополнительные советы по работе с UTC, чтобы избежать такой путаницы. Мой другой ответ не включает некоторые детали и комментарии, ссылаясь на этот ответ для получения дополнительной информации. - person Basil Bourque; 08.07.2018