【问题标题】:In Java, how do I get the difference in seconds between 2 dates?在 Java 中,如何获得两个日期之间的秒数差异?
【发布时间】:2023-03-22 19:02:01
【问题描述】:

Java 类库有一个名为 DateTime 的类。 DateTime 有这个方法:

int daysBetween(DateTime other)

返回 this 和参数之间的天数。 它没有方法

int secondsBetween(DateTime other)

我碰巧需要。 有没有类似DateTime但有这种方法的类?

【问题讨论】:

标签: java datetime date


【解决方案1】:

我想提供现代答案。当被问到这个问题时,其他答案都很好,但时间在继续。今天我推荐你使用java.time, the modern Java date and time API

    ZonedDateTime aDateTime = ZonedDateTime.of(2017, 12, 8, 19, 25, 48, 991000000, ZoneId.of("Europe/Sarajevo"));
    ZonedDateTime otherDateTime = ZonedDateTime.of(2017, 12, 8, 20, 10, 38, 238000000, ZoneId.of("Europe/Sarajevo"));

    long diff = ChronoUnit.SECONDS.between(aDateTime, otherDateTime);
    System.out.println("Difference: " + diff + " seconds");

打印出来:

Difference: 2689 seconds

ChronoUnit.SECONDS.between() 与两个ZonedDateTime 对象或两个OffsetDateTimes、两个LocalDateTimes 等一起使用。

如果您需要的不仅仅是秒数,您应该考虑使用Duration 类:

    Duration dur = Duration.between(aDateTime, otherDateTime);
    System.out.println("Duration: " + dur);
    System.out.println("Difference: " + dur.getSeconds() + " seconds");

打印出来:

Duration: PT44M49.247S
Difference: 2689 seconds

前两行以 ISO 8601 格式打印持续时间,输出表示持续时间为 44 分 49.247 秒。

为什么选择 java.time?

其他几个答案中使用的Date 类现在早已过时。 Joda-Time 也用于一对夫妇(可能在问题中)现在处于维护模式,没有计划进行重大改进,开发人员正式建议迁移到 java.time,也称为 JSR-310。

问题:我可以在我的 Java 版本中使用现代 API 吗?

如果至少使用 Java 6,则可以。

【讨论】:

  • 非常被低估的答案。 Jodatime 在这里的计算有点混乱。不过ChronoUnit.SECONDS.between(oldDate.toInstant(), newDate.toInstant()) 很容易记住。
【解决方案2】:

使用这个方法:

private Long secondsBetween(Date first, Date second){
    return (second.getTime() - first.getTime())/1000;
}

【讨论】:

  • 请为您的答案添加一些解释。
  • 很明显你需要发送两个日期,我的意思是,日期 initialDate = new Date() 和 Date finalDate = new Date() 所以如果你发送 initialDate 和 finalDate 你可以获得秒数的差异...它们都将使用 getTIme 方法“转换”为 Long,最后您将得到差值除以 1000 以获得秒...顺便说一句,答案很好!
【解决方案3】:

您可以使用org.apache.commons.lang.time.DateUtils 使其更干净:

(firstDate.getTime() - secondDate.getTime()) / DateUtils.MILLIS_PER_SECOND

【讨论】:

    【解决方案4】:

    不熟悉日期时间...

    如果您有两个日期,您可以在它们上调用 getTime 以获取毫秒,获取差异并除以 1000。例如

    Date d1 = ...;
    Date d2 = ...;
    long seconds = (d2.getTime()-d1.getTime())/1000;
    

    如果你有日历对象,你可以调用

    c.getTimeInMillis()
    

    做同样的事情

    【讨论】:

    • 时差不是那么大时-int seconds = (int) ((d2.getTime()-d1.getTime())/1000);
    • @sebrock - 固定显示类型为 long - 转换为 int 将适用于较小的数量
    • @Xdg 我最近在设计一个界面时遇到了同样的“问题”,但Integer.MAX_VALUE 可以在几秒钟内代表近 70 年。这对我来说已经足够了。
    • 我正在使用 LocalDateTime 寻找答案。
    【解决方案5】:

    你应该这样做

    org.joda.time.Seconds.secondBetween(date1, date2)
    

    【讨论】:

    • 欢迎来到 StackOverflow,感谢您的贡献。如果您解释了为什么这是要走的路,这将是一个更有力的帖子。
    • @divonas 没有区别。他的符号明确提到了 joda
    • 正确的方法名称是'secondsBetween'。也就是说,这是我使用 org.joda.time.DateTime 找到的最干净的方式。
    • 如果您希望结果为 int,您应该在结果上调用 getSeconds()。Seconds.secondsBetween(start, end).getSeconds()
    • 我认为现在有一种不需要 jodatime 的 java 8 方式来执行此操作。我正在寻找它。
    【解决方案6】:

    如果您使用的是 Joda(它可能在 JDK 7 中以 jsr 310 的形式出现,在此之前是单独的开源 api),那么有一个带有 secondsBetween 方法的 Seconds 类。

    这里是 javadoc 链接:http://joda-time.sourceforge.net/api-release/org/joda/time/Seconds.html#secondsBetween(org.joda.time.ReadableInstant,%20org.joda.time.ReadableInstant)

    【讨论】:

      【解决方案7】:

      只是一个指针: 如果您正在计算两个 java.util.Date 之间的差值,则将两个日期相减并除以 1000 的方法是合理的,但如果您从 Calendar 对象获取 java.util.Date 引用,请特别注意。 如果这样做,则需要考虑 TimeZone 的夏令时,因为您使用的日期之一可能发生在 DST 期间。

      这在 Prasoon 的链接中有解释,我建议花一些时间阅读它。

      【讨论】:

        【解决方案8】:

        不建议使用java.util.DateSystem.currentTimeMillis() 来测量经过的时间。这些日期不保证是单调的,并且会在修改系统时钟时发生变化(例如从服务器更正时)。这种情况可能很少发生,但为什么不编写更好的解决方案而不是担心可能出现的负面或非常大的变化呢?

        我建议使用System.nanoTime()

        long t1 = System.nanoTime();
        long t2 = System.nanoTime();
        
        long elapsedTimeInSeconds = (t2 - t1) / 1000000000;
        

        编辑

        有关单调性的更多信息,请参阅answer 我提出的一个相关问题,在可能的情况下,nanoTime 使用单调时钟。我已经测试过,但只使用了 Windows XP、Java 1.6 并修改了时钟,其中 nanoTime 是单调的,currentTimeMillis 不是。

        同样来自Java's Real time doc's

        Q: 50. 时间是通过 分辨率更高的实时时钟 比返回的 System.nanoTime()?

        实时时钟和 System.nanoTime() 都基于 相同的系统调用,因此相同 时钟。

        使用 Java RTS,所有基于时间的 API (例如,定时器、定期 线程、截止日期监控等 四)是基于 高分辨率计时器。并且,一起 通过实时优先级,他们可以 确保适当的代码将 在正确的时间执行 实时约束。相比之下, 普通的 Java SE API 只提供了一些 能够处理的方法 高分辨率时间,没有 在给定的执行保证 时间。 在之间使用 System.nanoTime() 代码中要执行的各个点 经过时间的测量应该 始终准确。

        【讨论】:

        • 嗯,有趣的帖子。是什么让您说 nanoTime 不受时钟更新的影响?我在 Java 文档中没有看到任何关于此的内容。我并不是说你错了,我一定想知道你是否有参考资料或进行过实验来支持这一点。
        【解决方案9】:

        哪个班?你是说 Joda DateTime 类吗?如果是这样,您可以简单地对每个调用 getMillis(),并执行适当的减法/缩放。

        顺便说一句,我会推荐 Joda 用于日期/时间工作,因为它有用且直观的 API,以及格式化/解析选项的线程安全性。

        【讨论】:

        • 那不是标准库(Joda 也不是),也不是特别知名(不像 Joda)
        【解决方案10】:

        应该这样做:

        Date a = ...;
        Date b = ...;
        
        Math.abs(a.getTime()-b.getTime())/1000;
        

        这里是相关文档:Date.getTime()。请注意,这仅适用于 1970 年 1 月 1 日 00:00:00 GMT 之后的日期

        【讨论】:

        • 嗯,为什么这只适用于 1970 年 1 月 1 日之后的日期?在此之前,这些值为负数,但算术适用于负数。
        【解决方案11】:

        标准 Java SE API 中没有 DateTime 这样的类。尽管在 joda-time 中有一个,但即使这样也没有 daysBetween 方法。

        使用标准 Java API,获得两个 java.util.Date 对象之间秒数的最简单方法是减去它们的时间戳并除以 1000:

        int secondsBetween = (date1.getTime() - date2.getTime()) / 1000;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-06-13
          • 2022-12-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-06
          • 1970-01-01
          • 2014-01-14
          相关资源
          最近更新 更多