java.time
您必须首先了解,与早期版本的 Java 捆绑在一起的那些旧的日期时间类是一堆设计糟糕的类和 hack 的混乱混乱。它们是业界首次尝试使用复杂的日期时间处理设施,并且值得称赞。但最终他们失败了。
它们已被 Java 8 及更高版本中内置的新 java.time 框架所取代。
仅对于日期,没有时间和时区,使用java.time.LocalDate。在UTC 的时间线上暂时使用java.time.Instant。要为 Instant 分配不同的时区,请使用 java.time.ZonedDateTime。
了解与 UTC 的偏移仅比 UTC 早或晚数小时和数分钟。时区是某个地区的人们使用的偏移量的过去、现在和未来变化的历史。
如果您的日期时间值具有与 UTC 的偏移量而不是时区,请使用 OffsetDateTime 类表示。然后调用它的toInstant 方法来获取一个Instant 对象,该对象以类似于SQL 标准TIMESTAMP WITH TIME ZONE 的类型的列发送到您的数据库。
SQL 标准类型TIMESTAMP WITHOUT TIME ZONE(不带,而不是带)故意缺少任何时区或与UTC 偏移的概念。旧的日期时间类无法表示这样的值。现在,在 java.time 中,我们有 LocalDateTime。
如果您的JDBC driver 符合 JDBC 4.2 或更高版本,您可以直接与数据库交换 java.time 对象。无需再次使用 java.sql 日期项类型。
myPreparedStatement.setObject( … , instant ) ;
和检索。
Instant instant = myResultSet.getObject( … , Instant.class ) ;
调整到特定地区(时区)人们使用的挂钟时间。
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
关于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。