2016-01-13 102 views
1

我需要在几个月内两个日期之间的差异之间的月份差,我使用约达时间,问题是这样的:乔达时间 - 两个日期

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会有问题。

+1

即使上面的问题是关于天,它是非常类似于你的问题,解决方案是相同的,调用'DateTime#toLocalDate()'将'LocalDate'传递给'Months#monthsBetween',而不是'DateTime '。 – Tom

+1

为什么你首先使用'new Datetime()。withDate()'?它创建当前时刻的DateTime实例,然后更改它(将时间字段保持原样)。如果你想没有时间创建新的特定日期,只需使用[LocalDate](http://www.joda.org/joda-time/apidocs/org/joda/time/LocalDate.html),然后选择Months.monthsBetween (date1,date2)'会正常工作。 – djxak

回答

5

改变第一日至2015年2月2日,乔达正确返回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-01date2指的是。 您也可以参考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

只是一个细节,DateTime有withTimeAtStartOfDay()方法 – TheJudge

-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) 
5

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

则返回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说:

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

但事实并非如此。它真的会在几个月内计算差异。不是的月数

+1

是的,我的错。由于'date1'在'date2'之后,它实际上返回'-1'。 “Months.monthsBetween'文档从未说过*月的时间段*可能是负面的。 :)但对于问题和接受的答案也是如此,并没有改变任何东西。我编辑我的答案使用'Math.abs'。 – djxak

+0

我想最好向OP(在答案中)解释为什么它返回-1与当前的代码并使用'Months.monthsBetween(date2,date1);'而不是。它就像调用'X.compareTo(Y)'与'Y.compareTo(X)'一样,结果也会被反转:D。 – Tom