tl;博士
Joda-Time 项目处于维护模式,现在被 java.time 类取代。
以 UTC 捕获当前时刻。
Instant.now()
将该时刻存储在数据库中:
myPreparedStatement.setObject( … , Instant.now() ) // Writes an `Instant` to database.
从数据库中检索那个时刻:
myResultSet.getObject( … , Instant.class ) // Instantiates a `Instant`
将挂钟时间调整为特定时区的时间。
instant.atZone( z ) // Instantiates a `ZonedDateTime`
LocalDateTime 是错误的类
其他答案是正确的,但他们没有指出 LocalDateTime 是错误的类。
在 java.time 和 Joda-Time 中,LocalDateTime 故意缺少任何时区或与 UTC 偏移的概念。因此,它确实不代表一个时刻,并且不是时间线上的一个点。 LocalDateTime 代表关于大约 26-27 小时范围内潜在时刻的粗略概念。
当区域/偏移量未知(不是很好的情况)或区域偏移量不确定时,使用LocalDateTime。例如,“圣诞节从 2018 年 12 月 25 日的第一刻开始”将表示为 LocalDateTime。
使用ZonedDateTime 表示特定时区的某个时刻。例如,在Pacific/Auckland 或America/Montreal 等任何特定区域开始的圣诞节将用ZonedDateTime 对象表示。
暂时始终使用 UTC,请使用 Instant。
Instant instant = Instant.now() ; // Capture the current moment in UTC.
应用时区。同一时刻,时间轴上的同一点,但以不同的挂钟时间查看。
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ; // Same moment, different wall-clock time.
所以,如果我可以在 LocalDate 和 LocalDateTime 之间进行转换,
不,错误的策略。如果您有仅日期值,并且需要日期时间值,则必须指定时间。对于特定区域,该时间可能在该日期无效 - 在这种情况下,ZonedDateTime 类会根据需要自动调整时间。
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ; // 14:00 = 2 PM.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
如果您想将一天中的第一个时刻作为您的时间,让 java.time 确定那个时刻。不要假设一天从 00:00:00 开始。夏令时 (DST) 等异常情况意味着一天可能从另一个时间开始,例如 01:00:00。
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
java.sql.Timestamp 是错误的类
java.sql.Timestamp 是麻烦的旧日期时间类的一部分,这些类现在已经遗留,完全被 java.time 类所取代。该类用于表示UTC 中的一个时刻,分辨率为nanoseconds。现在,java.time.Instant 可以实现这一目的。
JDBC 4.2 与 getObject/setObject
从JDBC 4.2 及以后,您的JDBC driver 可以通过调用直接与数据库交换java.time 对象:
例如:
myPreparedStatement.setObject( … , instant ) ;
……和……
Instant instant = myResultSet.getObject( … , Instant.class ) ;
转换传统 ⬌ 现代
如果您必须与尚未更新到 java.time 的旧代码交互,请使用添加到旧类的新方法来回转换。
Instant instant = myJavaSqlTimestamp.toInstant() ; // Going from legacy class to modern class.
……和……
java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ; // Going from modern class to legacy 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。