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类所取代。
避免使用 .但是,如果必须与尚未针对 java.time 类型更新的旧代码进行交互,请转换。作为中间步骤,转换为问题代码中所示。XMLGregorianCalendar
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 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要类。java.sql.*
从哪里获取 java.time 类?
ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
等。