tl; dr
该乔达时间项目处于维护模式,现在取代java.time类。
在UTC中捕获当前时刻。
Instant.now()
将该时刻存储在数据库中:
myPreparedStatement.setObject( … , Instant.now() ) // Writes an `Instant` to database.
要从datbase检索该时刻:
myResultSet.getObject( … , Instant.class ) // Instantiates a `Instant`
将壁钟时间调整为特定时区的时间。
instant.atZone( z ) // Instantiates a `ZonedDateTime`
LocalDateTime
是错误的班级
其他答案是正确的,但他们未能指出这LocalDateTime
是您目的不正确的课程。
在java.time和Joda-Time中,LocalDateTime
故意缺乏时区或UTC偏移量的任何概念。因此,它并不能代表一个时刻,是不是在时间轴上的一个点。A LocalDateTime
代表关于大约26-27小时范围内潜在时刻的粗略想法。
使用LocalDateTime
的既可以当偏移区域/未知(不是一个好的情况),或者当区域偏移是不确定的。例如,“圣诞节始于2018年12月25日的第一刻”将表示为LocalDateTime
。
使用a 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
。
带有getObject
/的JDBC 4.2setObject
从JDBC 4.2及更高版本开始,您的JDBC驱动程序可以通过调用以下命令直接与数据库交换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和更高版本。这些类取代麻烦的老传统日期时间类,如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-额外项目与其他类扩展java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。你可能在这里找到一些有用的类,比如Interval
,YearWeek
,YearQuarter
,和更多。
java.sql.Timestamp
该类现在是旧式的,由java.time类(尤其是)取代了Instant
。