tl;博士
尽量避免使用旧的日期时间类。但如果交给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.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。