Joda时间 - 两个日期之间的月份差异

时间:2016-01-13 17:27:01

标签: java jodatime

我需要在两个日期之间获得差异,我使用Joda Time,问题是:

DateTime date1 = new DateTime().withDate(2015, 2, 1);
DateTime date2 = new DateTime().withDate(2015, 1, 1);
Months m = Months.monthsBetween(date1, date2);
int monthDif = m.getMonths();//this return 0 

它返回0,因为在两个日期的中间没有月份,我需要在几个月之间返回差异而不是几个月之间,并且当日期相同时,添加1会有问题。

3 个答案:

答案 0 :(得分:15)

将第一个日期更改为2015-02-02,Joda正确返回1个月:

DateTime date1 = new DateTime().withDate(2015, 2, 2);
DateTime date2 = new DateTime().withDate(2015, 1, 1);

System.out.println(Months.monthsBetween(date2, date1).getMonths());
// Returns 1.

所以我的猜测是因为你没有提供时间部分,所以Joda无法准确确定 2015-01-01 date2所指的时间点。 您可能已经提到23:59:59 ,在这种情况下,从技术上讲,整整一个月还没有过去。

如果您明确提供零时间部分,它将按您最初的预期工作:

DateTime date1 = new DateTime().withDate(2015, 2, 1).withTime(0, 0, 0, 0);
DateTime date2 = new DateTime().withDate(2015, 1, 1).withTime(0, 0, 0, 0);

System.out.println(Months.monthsBetween(date2, date1).getMonths());
// Returns 1.

因此,我建议您在每个日期明确指定00:00:00时间部分。

答案 1 :(得分:6)

虽然其他答案是正确的,但他们仍然掩盖了真正的问题。

  

它返回0,因为在两个日期中间没有月份

没有。它返回0,因为有DateTime个对象的时间部分。您创建两个DateTime的格式,填充当前时刻(小时,分钟,秒和毫秒),然后修改日期部分。如果您只想比较两个日期,没有理由这样做。请改用LocalDate

LocalDate date1 = new LocalDate(2015, 2, 1);
LocalDate date2 = new LocalDate(2015, 1, 1);
Months m = Months.monthsBetween(date1, date2);
int monthDif = Math.abs(m.getMonths());//this return 1

还需要注意这样一个事实:尽管Months文档没有说明这一点,但如果第一个日期在第二个日期之后,Month可以包含负值。因此,我们需要使用Math.abs来真正计算两个日期之间的月数。

docs说:

  

创建一个月份,表示两个指定的部分日期时间之间的整月数。

但这不是真的。它确实计算了几个月的差异。不是月数

答案 2 :(得分:-1)

计算方法取决于要使用的业务逻辑。每个月的长度各不相同。一种选择是,在monthsBetween()函数中,获取date1date2的月份开头,并进行比较。

类似的东西:

DateTime firstOfMonthDate1 = new DateTime(date1.getYear(), date1.getMonthOfYear(), 1, 0, 0);
DateTime firstOfMonthDate2 = new DateTime(date2.getYear(), date2.getMonthOfYear(), 1, 0, 0);
Months m = Months.monthsBetween(firstOfMonthDate1, firstOfMonthDate2)