Java类库具有一个名为DateTime的类。DateTime具有此方法:
int daysBetween(DateTime other)
该参数返回此参数与参数之间的天数。它没有方法
int secondsBetween(DateTime other)
我碰巧需要的。是否有一个类似于DateTime但有这种方法的类?
Java类库具有一个名为DateTime的类。DateTime具有此方法:
int daysBetween(DateTime other)
该参数返回此参数与参数之间的天数。它没有方法
int secondsBetween(DateTime other)
我碰巧需要的。是否有一个类似于DateTime但有这种方法的类?
Answers:
不熟悉DateTime ...
如果您有两个日期,则可以对它们调用getTime以获取毫秒,获取diff并除以1000。例如
Date d1 = ...;
Date d2 = ...;
long seconds = (d2.getTime()-d1.getTime())/1000;
如果您有日历对象,则可以调用
c.getTimeInMillis()
并做同样的事情
Integer.MAX_VALUE
可以代表将近70年的时间。这对我来说足够了。
我想提供现代的答案。当问这个问题时,其他答案都很好,但是时间还在继续。今天,我建议您使用java.time
现代的Java日期和时间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
,两个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,则可以。
ChronoUnit.SECONDS.between(oldDate.toInstant(), newDate.toInstant())
相当容易记住。
你应该做
org.joda.time.Seconds.secondBetween(date1, date2)
Seconds.secondsBetween(start, end).getSeconds()
应该这样做:
Date a = ...;
Date b = ...;
Math.abs(a.getTime()-b.getTime())/1000;
这里是相关文档:Date.getTime()。请注意,这仅适用于格林尼治标准时间1970年1月1日00:00:00之后的日期
不建议使用java.util.Date
或System.currentTimeMillis()
测量经过的时间。这些日期不能保证是单调的,并且在修改系统时钟时(例如,从服务器更正后)会发生更改。很有可能这种情况很少发生,但是为什么不编写一个更好的解决方案,而不是担心可能的消极变化或非常大的变化?
相反,我建议使用System.nanoTime()
。
long t1 = System.nanoTime();
long t2 = System.nanoTime();
long elapsedTimeInSeconds = (t2 - t1) / 1000000000;
编辑
有关单调性的更多信息,请参见我询问的一个相关问题的答案,在可能的情况下,nanoTime使用单调时钟。我已经测试过,但仅使用Windows XP,Java 1.6并修改了时钟,nanoTime
而currentTimeMillis
这不是单调的。
同样来自Java的实时文档:
问:50。通过实时时钟返回的时间是否比System.nanoTime()返回的时间分辨率更高?
实时时钟和System.nanoTime()都基于相同的系统调用,因此也基于相同的时钟。
使用Java RTS,所有基于时间的API(例如,计时器,定期线程,截止日期监视等)都基于高分辨率计时器。并且,与实时优先级一起,它们可以确保针对实时约束在适当的时间执行适当的代码。相反,普通的Java SE API仅提供几种能够处理高分辨率时间的方法,而不能保证在给定时间执行。在代码的各个点之间使用System.nanoTime()进行经过时间的测量应始终准确。
如果您使用的是Joda(在JDK 7中可能以jsr 310的形式出现,请在此之前使用单独的开源api),然后使用Seconds类使用secondsBetween方法。
这是javadoc链接:http : //joda-time.sourceforge.net/api-release/org/joda/time/Seconds.html#secondsBetween(org.joda.time.ReadableInstant,%20org.joda.time.ReadableInstant)
哪一堂课 ?您是说Joda DateTime类吗?如果是这样,您可以简单地调用getMillis()
每个,然后执行适当的减法/缩放。
我推荐Joda从事日期/时间工作,顺便说一句,因为它有用且直观的API,并且它的格式化/解析选项具有线程安全性。
只是一个指针:如果要计算两个java.util.Date之间的差,则减去两个日期并将其除以1000的方法是合理的,但是要特别小心,如果从Calendar对象获取java.util.Date引用。如果这样做,则需要考虑TimeZone的夏令时,因为您使用的日期之一可能发生在DST期间。
在Prasoon的链接中对此进行了解释,我建议花一些时间阅读它。
使用此方法:
private Long secondsBetween(Date first, Date second){
return (second.getTime() - first.getTime())/1000;
}