简述
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
故意缺乏任何时区或偏移量的概念。因此,它不代表一个瞬间,并且不是时间轴上的一个点。 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中的一个时刻,分辨率为纳秒。现在可以使用java.time.Instant
来实现此目的。
JDBC 4.2与getObject
/setObject
从JDBC 4.2及更高版本开始,您的JDBC驱动程序可以通过调用以下方法直接与数据库交换java.time对象:
例如:
myPreparedStatement.setObject( … , instant ) ;
...和...
Instant instant = myResultSet.getObject( … , Instant.class ) ;
将传统代码转换为现代代码
如果必须与尚未更新到java.time的旧代码进行接口交互,则可以使用添加到旧类中的新方法进行来回转换。
Instant instant = myJavaSqlTimestamp.toInstant() ;
…and…
java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ; // Going from modern class to legacy 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
和更多。
java.sql.Timestamp
类现已过时,被 java.time 类所取代,特别是Instant
。 - Basil Bourque