有大量的 SO 问题涉及在 Java 中计算两个日期或两次之间的差异。许多答案指出了核心Java Date 类的问题,并建议使用Jodatime,但是AFAIK,没有人建议如何使用jsr310 来做到这一点。
那么,jsr310中是否有计算两个日期或两次时间差的方法呢?
作为参考,以下问题处理此问题:
在核心 Java 中:
在Jodatime:
有大量的 SO 问题涉及在 Java 中计算两个日期或两次之间的差异。许多答案指出了核心Java Date 类的问题,并建议使用Jodatime,但是AFAIK,没有人建议如何使用jsr310 来做到这一点。
那么,jsr310中是否有计算两个日期或两次时间差的方法呢?
作为参考,以下问题处理此问题:
在核心 Java 中:
在Jodatime:
回答 wrt 到最终的 JDK1.8 版本。
有两个数量类 -Duration
和Period
。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);
如何做到这一点取决于正在使用的日期或日期时间类。
如果您是实时操作(即使用时区等,因此可以将日期时间精确定位到Instant
时间线上的确切位置),您可以使用Duration
类(javadoc) - 例如
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()
);
}