我需要得到两个日期之间的月差,我使用的是Joda时间,问题是:
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就会有问题。
发布于 2016-01-14 01:35:05
将第一个日期更改为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不能精确地确定 date2所指的2015-01-01的时间点。你也可以参考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.因此,我建议您在每个date 中显式地指定一个00:00:00时间部分。
发布于 2016-01-14 01:57:38
虽然其他答案是正确的,但它们仍然掩盖了真正的问题。
它返回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说:
创建一个月份,表示两个指定的部分日期时间之间的整月数。
但这不是真的。它真正计算的是以月为单位的差值。而不是月数。
发布于 2016-01-14 01:31:07
计算方法取决于要使用的业务逻辑。每个月的时间长短各不相同。一种选择是,在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)https://stackoverflow.com/questions/34773160
复制相似问题