我正在尝试将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
任何想法......?谢谢!
答案 0 :(得分:20)
我找到了答案:
Timestamp timestamp = new Timestamp(var2.getXMLGregorianCalendar().toGregorianCalendar().getTimeInMillis());
var1.setTimeStamp(timestamp);
答案 1 :(得分:1)
尝试避免使用旧的日期时间类。但是,如果递给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.
)
Instant instant = myResultSet.getObject( … , Instant.class ) ;
仅供参考, 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及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance 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中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。