java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了旧的麻烦的日期时间类,例如java.util.Date、.Calendar 和java.text.SimpleDateFormat。 Joda-Time 团队还建议迁移到 java.time。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。
大部分 java.time 功能在ThreeTen-Backport 中向后移植到 Java 6 和 7,并在 ThreeTenABP 中进一步适应 Android。
String input = "20160807000133";
DateTimeFormatter BASIC_ISO_DATETIME = DateTimeFormatter.ofPattern ( "uuuuMMddHHmmss" ); // Make constant somewhere in your codebase.
LocalDateTime ldt = LocalDateTime.parse ( input , BASIC_ISO_DATETIME );
转储到控制台。
System.out.println ( "input: " + input + " | ldt: " + ldt );
输入:20160807000133 |日期:2016-08-07T00:01:33
时区
请注意,您的输入数据会出错,即未能包含有关时区或与 UTC 的偏移量的任何信息。因此,它确实不代表时间线上的一个时刻。如果这些数据是针对巴黎的,那将是一个与蒙特利尔不同的时刻。
如果您知道上下文是针对某个时区的,请在数据库查询中使用此值之前应用 ZoneId。
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone ( zoneId );
zdt: 2016-08-07T00:01:33-04:00[美国/蒙特利尔]
数据库
如果您的 JDBC 驱动程序符合 JDBC 4.2 或更高版本,您应该能够通过setObject 和getObject 直接传递/获取java.time 类型。
如果没有,则回退到使用添加到旧类的新方法进行转换。对于java.sql.Timestamp,这意味着通过Instant,在UTC 时间线上的一个时刻,分辨率高达纳秒。我们可以从ZonedDateTime 中提取一个Instant 对象。
java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );
myPreparedStatement.setTimestamp( ts );
……和……
java.sql.Timestamp ts = myResultSet.getTimestamp( 1 );
Instant instant = ts.toInstant();
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = instant.atZone ( zoneId );