将 XMLGregorianCalendar 转换为 java.sql.Timestamptl;博士java.time关于 java.time

2022-09-03 05:16:00

我正在尝试将XMLGregorianCalendar日期分配给java.sql.Timestamp var,就像这样...

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

但显然,这不起作用,并抛出一个异常...

java.lang.IllegalArgumentException: Timestamp format must be 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

tl;博士

尽量避免使用旧日期时间类。但如果交给一个,就皈依现代类。无需使用。javax.xml.datatype.XMLGregorianCalendarjava.time.Instantjava.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

仅供参考,非常麻烦的旧日期时间类已被java.time类所取代。

避免使用 .但是,如果必须与尚未针对 java.time 类型更新的旧代码进行交互,请转换。作为中间步骤,转换为问题代码中所示。XMLGregorianCalendarGregorianCalendar

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

现在使用添加到旧类中的新方便转换方法来获取新式对象。GregorianCalendarjava.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.DateCalendarSimpleDateFormat

Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。

要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要类。java.sql.*

从哪里获取 java.time 类?

ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter