Java类库有一个名为DateTime的类。 DateTime有这个方法:
int daysBetween(DateTime other)
返回此参数与参数之间的天数。 它没有方法
int secondsBetween(DateTime other)
我碰巧需要。 是否有一个类似于DateTime的类但有这样的方法?
答案 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秒。
其他几个答案中使用的Date
类现在已经过时了。 Joda-Time也用于一对(可能在问题中)现在处于维护模式,没有计划重大增强,开发人员正式建议迁移到java.time
,也称为JSR-310。
如果至少使用Java 6 ,则可以。
答案 5 :(得分:3)
建议不要使用java.util.Date
或System.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
不是。
问:50。时间是通过 更好分辨率的实时时钟 而不是返回的 System.nanoTime()?
实时时钟和 System.nanoTime()都基于 相同的系统调用因此相同 时钟。
使用Java RTS,所有基于时间的API (例如,定时器,定期 线程,截止日期监控等 ())是基于 高分辨率计时器。而且,在一起 他们可以通过实时优先考虑 确保适当的代码 在适当的时间执行 实时约束。相反, 普通的Java SE API只提供了一些 能够处理的方法 高分辨率时代,没有 保证在给定的执行 时间。 之间使用System.nanoTime() 要执行的代码中的各个点 经过时间测量应该 总是准确的。
答案 6 :(得分:3)
如果您正在使用Joda(可能在JDK 7中以jsr 310形式出现,在此之前单独使用开源API),那么会有一个带有secondsBetween方法的Seconds类。
答案 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;
}