我正在添加Ole V.V的正确答案。
JDBC 4.2
特别是 - 我将主要与JDBC合作。
JDBC 4.2 添加了对与数据库交换 java.time 对象的支持。请参见 和 方法。PreparedStatement::setObject
ResultSet::getObject
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
LocalDate today = LocalDate.now( z ) ;
myPreparedStatement.setObject( … , today ) ;
检索。
LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
出于我无法理解的原因,JDBC 规范不需要支持两个最常用的类:Instant
和 ZonedDateTime
。您的数据库和 JDBC 驱动程序可能会也可能不会添加对这些驱动程序的支持。
如果没有,您可以轻松转换。从 OffsetDateTime 开始
,在 JDBC 中需要支持。
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
要通过特定区域(时区)的人员使用的挂钟时间查看此时刻,请应用 a 来获取对象。ZoneId
ZonedDateTime
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant() ;
要调整为 UTC,请提取 .根据定义,An 始终采用 UTC 格式。Instant
Instant
Instant instant = odt.toInstant() ;
您可以转换另一种方式,以写入数据库。
myPreparedStatement.setObject( … , zdt.toOffsetDateTime() ; // Converting from `ZonedDateTime` to `OffsetDateTime`. Same moment, same point on the timeline, different wall-clock time.
...和:
myPreparedStatement.setObject( … , instant.atOffset( ZoneOffset.UTC ) ) ; // Converting from `Instant` to `OffsetDateTime`. Same moment, same point on the timeline, and even the same offset. `OffsetDateTime` is a more flexible class with abilities such as (a) applying various offsets and (b) flexible formatting when generating text, while `Instant` is meant to be a more basic building-block class.
请注意 java.time 中使用的命名约定:、 、 、 、 等。at
from
to
with
关于 java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧旧日期时间类,如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310。
Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。
您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要类。java.sql.*
从哪里获取 java.time 类?
ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
等。