【问题标题】:compare time stamp stored in database in java比较java中存储在数据库中的时间戳
【发布时间】:2016-12-12 23:05:23
【问题描述】:

我正在使用 now() [example- 20160807000133] 在数据库表中存储当前时间戳 我想将存储在表中的这个时间戳与java中的当前时间戳进行比较。

怎么做?

我的主要任务是检查表中存储的数据是否在相对于当前时间的特定时间间隔内。

【问题讨论】:

  • 请贴出你目前尝试过的代码
  • 在查询本身中进行时间戳比较是最简单的,无需从 Java 传递日期时间变量。您正在使用哪个数据库以及您的查询目标是哪些表?

标签: java sql date time


【解决方案1】:

java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了旧的麻烦的日期时间类,例如java.util.Date.Calendarjava.text.SimpleDateFormatJoda-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 或更高版本,您应该能够通过setObjectgetObject 直接传递/获取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 );

【讨论】:

    猜你喜欢
    • 2015-09-22
    • 2013-01-12
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 2013-01-16
    • 2023-04-09
    相关资源
    最近更新 更多