我要添加到Ole VV的正确答案中
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 ) ;
要通过特定区域(时区)的人们使用的挂钟时间来查看这一刻,请应用ZoneId
来获取ZonedDateTime
对象。
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant() ;
要调整为UTC,请提取一个Instant
。根据Instant
定义,An始终使用UTC。
Instant instant = odt.toInstant() ;
您可以转换为另一种方式,以写入数据库。
myPreparedStatement.setObject( … , zdt.toOffsetDateTime() ;
…和:
myPreparedStatement.setObject( … , instant.atOffset( ZoneOffset.UTC ) ) ;
注意所使用的命名约定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-额外项目与其他类扩展java.time。该项目为将来可能在java.time中添加内容打下了基础。你可能在这里找到一些有用的类,比如Interval
,YearWeek
,YearQuarter
,和更多。
good old java.util.Date
-很旧,但是不好。新代码应使用新的API。