首页 > 解决方案 > 如何通过比较java中的两个时间戳来查找以毫秒为单位的经过时间

问题描述

我需要通过将时间戳中的当前时间与 java 中创建的时间戳进行比较来找到以毫秒为单位的经过时间

例如

Updated Timestamp from DB column : 26/07/20 12:00:19.330000000 PM
Current Timestamp : 26/07/20 11:55:19.330000000 AM

超时配置 2 分钟

要获取当前时间戳,

  public static Timestamp getTimestampinGMT(Date date) {
      DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
      df.setTimeZone(TimeZone.getTimeZone("GMT"));
      String strCurrentTimeInGMT = df.format(date);
      return Timestamp.valueOf(strCurrentTimeInGMT);
  }

我正在将更新的时间戳列从 DB 转换为毫秒

Timestamp.valueOf(createtime).getTime()

超时配置 2 分钟转换为毫秒,

TimeUnit.MINUTES.toMillis(2);

有没有最好的方法来比较时间戳和计算经过的时间?

标签: javaoracletimetimestampelapsedtime

解决方案


从数据库中获取更新的时间戳作为日期时间对象。添加两分钟以获得超时时间。与当前时间进行比较。

    ResultSet rs = yourPreparedStatement.executeQuery();
    if (rs.next()) {
        OffsetDateTime odt = rs.getObject("your_db_column", OffsetDateTime.class);
        OffsetDateTime currentTime = OffsetDateTime.now(odt.getOffset());
        OffsetDateTime timeoutOdt = odt.plus(TIMEOUT);
        if (currentTime.isAfter(timeoutOdt)) {
            System.out.println("Timed out");
        }
        else {
            System.out.println("Not timed out yet");
        }
    }

我假设了一个TIMEOUT常量类型Duration。这是灵活的,因为它允许您以分钟或毫秒或您喜欢的单位定义超时。例如:

private static final String CONFIGUTRED_TIMEOUT = "PT2M"; // get from configuration
private static final Duration TIMEOUT = Duration.parse(CONFIGUTRED_TIMEOUT);

配置的超时PT2M可能看起来很有趣。阅读时间为 2 分钟。格式为 ISO 8601。您也可以使用例如Duration.ofMinutes(2)Duration.ofMillis(120_000)

如果您的 Oracle 数据库中的数据类型是timestamp with time zone,这是推荐的,您应该能够OffsetDateTime按所示检索它。你也可以试试ZonedDateTimeInstant。如果数据库中的列没有任何时区,则使用其方法检索LocalDateTime并转换为正确的时区。atZone

您尝试使用的日期和时间类DateDateFormatSimpleDateFormatTimeZoneTimestamp, 都设计得很糟糕并且都已经过时了。避免使用那些。


推荐阅读