有很多SO问题涉及计算Java中两个日期或两个日期之间的差异。许多答案指出了核心Java Date类的问题,并建议使用Jodatime,但AFAIK,没有任何建议如何使用jsr310来做到这一点。
那么,有什么方法可以在jsr310中计算两个日期或两次之间的差异吗?
作为参考,以下问题可以解决此问题:
核心Java:
在Jodatime:
答案 0 :(得分:5)
回答最终的JDK1.8版本。
有两个金额类别 - Duration
和Period
。持续时间是基于时间的(纳米),期间是基于日期的(年/月/日)。
相同类型的两个临时对象之间的时间量可以通过两种方式之一轻松计算(我更喜欢第一种):
long days = ChronoUnit.DAYS.between(start, end);
long days = start.until(end, ChronoUnit.DAYS);
相同类型的两个临时对象之间的Duration
可以如下计算:
Duration d = Duration.between(start, end);
两个Period
对象之间的LocalDate
可以按如下方式计算:
Period p = Period.between(start, end);
答案 1 :(得分:0)
如何执行此操作取决于使用的日期或日期时间类。
如果您是实时操作(即使用时区等,以便日期时间可以精确定位到时间线上的Instant
),您可以使用Duration
类({ {3}}) - 例如
Duration diff = Duration.between(InstantProvider startInc, InstantProvider endInc);
InstantProvider能够
或者,如果您在假设时间(即没有时区等)操作,则可以使用Period
类(javadoc)来获取LocalDate
的两个实例之间的差异 - 例如
// diff in days, months and years:
Period diff = Period.between(LocalDate start, LocalDate end);
// diff in days:
Period diff = Period.daysBetween(LocalDate start, LocalDate end);
但是,我不知道任何方便的方法来获取两个LocalDateTimes或LocalTimes之间的区别。但是......这可以使用Period来完成,如下所示:
// diff between LocalDateTimes:
public static Period between(LocalDateTime start, LocalDateTime end){
return Period.of(
end.getYear()-start.getYear(),
end.getMonthOfYear().getValue()-start.getMonthOfYear().getValue(),
end.getDayOfMonth()-start.getDayOfMonth(),
end.getHourOfDay()-start.getHourOfDay(),
end.getMinuteOfHour()-start.getMinuteOfHour(),
end.getSecondOfMinute()-start.getSecondOfMinute(),
end.getNanoOfSecond()-start.getNanoOfSecond()
);
}
// diff between LocalTimes:
public static Period between(LocalTime start, LocalTime end){
return Period.of(0, 0, 0,
end.getHourOfDay()-start.getHourOfDay(),
end.getMinuteOfHour()-start.getMinuteOfHour(),
end.getSecondOfMinute()-start.getSecondOfMinute(),
end.getNanoOfSecond()-start.getNanoOfSecond()
);
}