java.time
现代方法使用取代最早版本的Java捆绑的麻烦的遗留日期时间类的
java.time类。
java.sql.Timestamp
类是其中之一遗留类,不再需要。相反,使用
Instant
或其他java.time类直接使用JDBC 4.2及更高版本与数据库交互。
Instant
类表示时间线上以
UTC为基准的瞬间,分辨率为
纳秒(小数部分最多九个数字)。
Instant instant = myResultSet.getObject( … , Instant.class ) ;
如果您必须与现有的
Timestamp
进行交互操作,则应立即通过添加到旧类中的新转换方法将其转换为java.time。
Instant instant = myTimestamp.toInstant() ;
为了调整到另一个时区,需要将时区指定为一个
ZoneId
对象。用
continent/region
的格式指定
正确的时区名称,例如
America/Montreal
、
Africa/Casablanca
或者
Pacific/Auckland
。绝不要使用像
EST
或者
IST
这样的 3-4 个字母的伪时区,因为它们既不是真正的时区,也没有标准化,甚至不是唯一的!
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时间,可以创建一个使用UTC常量
ZoneOffset.UTC
作为偏移量的
OffsetDateTime
对象。
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类?
该项目扩展了java.time类库,称为
ThreeTen-Extra。该项目是未来可能添加到java.time的测试场所。在这里,您可以找到一些有用的类,例如
Interval
、
YearWeek
、
YearQuarter
以及
更多。