我需要在两个日期之间获得差异,我使用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会有问题。
答案 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()
函数中,获取date1
和date2
的月份开头,并进行比较。
类似的东西:
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)