我使用now()将当前时间戳存储在数据库表中[example-20160807000133] 我想将表中存储的时间戳与java中的当前时间戳进行比较。
怎么做?
我的主要任务是检查表中存储的数据是否在相对于当前时间的特定时间间隔内。
答案 0 :(得分:0)
java.time框架内置于Java 8及更高版本中。这些类取代了旧的麻烦日期时间类,例如java.util.Date
,.Calendar
和& java.text.SimpleDateFormat
。 Joda-Time团队还建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。
大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的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 | ldt: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或更高版本,您应该能够通过java.time
&直接传递/获取setObject
类型。 getObject
。
如果没有,则回退到使用添加到旧类的新方法进行转换。对于java.sql.Timestamp
,这意味着要经过Instant
,在UTC时间轴上的一个时刻,分辨率最高可达纳秒。我们可以从Instant
中提取ZonedDateTime
个对象。
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 );