将XMLGregorianCalendar转换为java.sql.Timestamp

时间:2012-09-20 07:58:23

标签: java date timestamp gregorian-calendar

我正在尝试将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

任何想法......?谢谢!

2 个答案:

答案 0 :(得分:20)

我找到了答案:

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

答案 1 :(得分:1)

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.time

仅供参考, 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及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

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

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore