在Java中,如何获得2个日期之间的秒数差异?

时间:2009-12-28 16:25:21

标签: java datetime date

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

int daysBetween(DateTime other)

返回此参数与参数之间的天数。 它没有方法

int secondsBetween(DateTime other)

我碰巧需要。 是否有一个类似于DateTime的类但有这样的方法?

11 个答案:

答案 0 :(得分:148)

不熟悉DateTime ...

如果你有两个日期,你可以在它们上面调用getTime来获得毫秒数,得到差异并除以1000.例如

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

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

c.getTimeInMillis()

并做同样的事情

答案 1 :(得分:9)

你应该做

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

答案 2 :(得分:7)

应该这样做:

Date a = ...;
Date b = ...;

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

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

答案 3 :(得分:5)

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

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

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

答案 4 :(得分:4)

我想提供现代的答案。当问到这个问题时,其他答案都很好,但时间会继续。今天我建议您使用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个对象或两个OffsetDateTime s,两个LocalDateTime等。

如果你需要的不仅仅是秒数,你应该考虑使用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 ,则可以。

  • 在Java 8及更高版本中,内置了新的API。
  • 在Java 6和7中获取the ThreeTen Backport,新类的backport({3}}的ThreeTen)。
  • 在Android上,使用Android版的ThreeTen Backport。它被称为ThreeTenABP,在JSR 310中有详尽的解释。

答案 5 :(得分:3)

建议不要使用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

  

问:50。时间是通过   更好分辨率的实时时钟   而不是返回的   System.nanoTime()?

     

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

     

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

答案 6 :(得分:3)

如果您正在使用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 :(得分:2)

您可以使用org.apache.commons.lang.time.DateUtils使其更清洁:

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

答案 8 :(得分:0)

哪个班?你的意思是Joda DateTime课吗?如果是这样,您只需在每个上调用getMillis(),然后执行相应的减法/缩放。

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

答案 9 :(得分:0)

只是一个指针: 如果你正在计算两个java.util.Date之间的差异,那么减去两个日期并将其除以1000的方法是合理的,但如果从Calendar对象获得java.util.Date引用,则要特别小心。 如果您这样做,则需要考虑TimeZone的夏令时,因为您使用的其中一个日期可能会在DST期间发生。

这是在Prasoon的链接上解释的,我建议花点时间阅读它。

答案 10 :(得分:0)

使用此方法:

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