java.time
现代方法使用了java.time类,该类取代了与最早的Java版本捆绑在一起的麻烦的旧式日期时间类。
该java.sql.Timestamp
班是这些传统类之一。不再需要。而是使用Instant
JDBC 4.2及更高版本直接在数据库中使用或其他java.time类。
该Instant
级表示时间轴上的时刻UTC,分辨率为纳秒(最多小数的9个位数)。
Instant instant = myResultSet.getObject( … , Instant.class ) ;
如果您必须与现有互操作Timestamp
,则可以通过添加到旧类中的新转换方法立即将其转换为java.time。
Instant instant = myTimestamp.toInstant() ;
要调整到另一个时区,请将时区指定为ZoneId
对象。指定适当的时区名称,格式continent/region
,如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用3-4个字母的伪时区,例如EST
或,IST
因为它们不是真实的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
应用于Instant
生成ZonedDateTime
对象。
ZonedDateTime zdt = instant.atZone( z ) ;
要生成要显示给用户的字符串,请搜索Stack Overflow DateTimeFormatter
以查找许多讨论和示例。
您的问题实际上是关于从用户数据输入到日期时间对象的另一个方向。通常最好将数据输入分为两部分,日期和一天中的时间。
LocalDate ld = LocalDate.parse( dateInput , DateTimeFormatter.ofPattern( "M/d/uuuu" , Locale.US ) ) ;
LocalTime lt = LocalTime.parse( timeInput , DateTimeFormatter.ofPattern( "H:m a" , Locale.US ) ) ;
您的问题不清楚。您是否要解释用户以UTC输入的日期和时间?还是在另一个时区?
如果您要使用UTC,请OffsetDateTime
使用UTC的常数创建一个带有偏移量的ZoneOffset.UTC
。
OffsetDateTime odt = OffsetDateTime.of( ld , lt , ZoneOffset.UTC ) ;
如果您要使用其他时区,请与时区对象组合在一起ZoneId
。但是哪个时区?您可能会检测到默认时区。或者,如果很关键,则必须与用户确认他们的意图。
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
要获得一个定义始终为UTC的简单对象,请提取一个Instant
。
Instant instant = odt.toInstant() ;
…要么…
Instant instant = zdt.toInstant() ;
发送到您的数据库。
myPreparedStatement.setObject( … , instant ) ;
关于java.time
该java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.Date
,Calendar
,和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
在哪里获取java.time类?
该ThreeTen-额外项目与其他类扩展java.time。该项目是将来可能向java.time添加内容的试验场。你可能在这里找到一些有用的类,比如Interval
,YearWeek
,YearQuarter
,和更多。