【发布时间】:2012-06-26 14:36:07
【问题描述】:
有大量的 SO 问题涉及在 Java 中计算两个日期或两次之间的差异。许多答案指出了核心 Java Date 类的问题,并建议使用 Jodatime,但是 AFAIK,没有人建议如何使用 jsr310 来做到这一点。
那么,在jsr310中有什么方法可以计算两个日期或者两次的差吗?
作为参考,以下问题处理此问题:
在核心 Java 中:
在Jodatime:
【问题讨论】:
有大量的 SO 问题涉及在 Java 中计算两个日期或两次之间的差异。许多答案指出了核心 Java Date 类的问题,并建议使用 Jodatime,但是 AFAIK,没有人建议如何使用 jsr310 来做到这一点。
那么,在jsr310中有什么方法可以计算两个日期或者两次的差吗?
作为参考,以下问题处理此问题:
在核心 Java 中:
在Jodatime:
【问题讨论】:
如何做到这一点取决于所使用的日期或日期时间类。
如果您是实时操作(即使用时区等,因此可以将日期时间精确定位到时间线上的确切 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()
);
}
【讨论】:
LocalDateTime 对象一起使用时同样困惑的人:有一个类似于使用的 Period.of 方法的构造函数,除了它有一个 weeks 参数(第三,就在几个月之后)并且PeriodType 应该设置为PeriodType.yearMonthDayTime()。不幸的是,在尝试创建Duration 时它变得无效,因为月份没有标准表示,因为月份差异为 28 到 31 天。如果这是你的目标,那么你应该只转换为Date,然后减去getTime()s。
weeks 在上面的计算中应该设置为0,除非你碰巧知道。 amaidment 的方法有效,我的评论只是那是我想做的事情的一个限制,我想为现在使用 Joda 而不是等待 JDK8 的人提供答案。
回答最终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);
两个LocalDate对象之间的Period可以计算如下:
Period p = Period.between(start, end);
【讨论】:
Period - 当你说 Period 是“基于日期”时,这是否意味着它将不再有小时、分钟的概念, 等等。? 1.8 b75 的 Javadoc 仍然显示采用 h、m、s 等的静态构造函数。此外,between(TemporalAccessor, TemporalAccessor) 方法是否考虑了时间差异和日期差异? (澄清一下,我还在用 0.6.3)