一尘不染

Java Joda-Time中两个日期之间的天数

java

如何找到两个Joda-Time DateTime实例之间的天数差异?“天数差异”是指如果开始时间是星期一,结束时间是星期二,则无论返回日期和开始时间/结束时间是小时/分钟/秒,我都希望返回值为1。

Days.daysBetween(start, end).getDays() 如果开始时间是晚上,结束时间是上午,则给我0。

我在其他日期字段上也遇到了同样的问题,因此我希望有一种通用的方法可以“忽略”重要性较低的字段。

换句话说,2月至3月4日之间的月份也将为1,而14:45至15:12之间的时间也会为1。但是14:01和14:55之间的时差为0。


阅读 1015

收藏
2020-03-01

共1个答案

一尘不染

令人讨厌的是,withTimeAtStartOfDay答案是错误的,但只是偶尔出现。你要:

Days.daysBetween(start.toLocalDate(), end.toLocalDate()).getDays()

事实证明,“midnight/start 的开始时间”有时是指凌晨1点(某些地方以这种方式实现夏令时),而Days.daysBetween无法正确处理。

// 5am on the 20th to 1pm on the 21st, October 2013, Brazil
DateTimeZone BRAZIL = DateTimeZone.forID("America/Sao_Paulo");
DateTime start = new DateTime(2013, 10, 20, 5, 0, 0, BRAZIL);
DateTime end = new DateTime(2013, 10, 21, 13, 0, 0, BRAZIL);
System.out.println(daysBetween(start.withTimeAtStartOfDay(),
                               end.withTimeAtStartOfDay()).getDays());
// prints 0
System.out.println(daysBetween(start.toLocalDate(),
                               end.toLocalDate()).getDays());
// prints 1

通过走出去LocalDate回避了整个问题。

2020-03-01