使用Java计算两个日期之间的月份差异

33

我需要使用Java获取两个日期之间的差异,结果应该以月为单位。

例如:

开始日期=2013-04-03 结束日期=2013-05-03 结果应该是1

如果间隔为

开始日期=2013-04-03 结束日期=2014-04-03 结果应该是12

使用以下代码,我可以获得天数的结果。如何以月为单位获得结果?

Date startDate = new Date(2013,2,2);
Date endDate = new Date(2013,3,2);
int difInDays = (int) ((endDate.getTime() - startDate.getTime())/(1000*60*60*24));

你可以使用外部库,比如JodaTime吗? - Keppil
3
如果你使用JodaTime,那么这里有一个类似的问题,并且有一个简单的答案:https://dev59.com/01nUa4cB1Zd3GeqPcqca - maba
1
在2013-01-31和2013-02-01之间,你想要什么?0个月还是1个月? - Étienne Miret
在这种情况下,我并不真的想要计算天数。我只想要确切的月份差异。 - ashu
3个回答

111

如果您不能使用JodaTime,您可以采取以下方法:

Calendar startCalendar = new GregorianCalendar();
startCalendar.setTime(startDate);
Calendar endCalendar = new GregorianCalendar();
endCalendar.setTime(endDate);

int diffYear = endCalendar.get(Calendar.YEAR) - startCalendar.get(Calendar.YEAR);
int diffMonth = diffYear * 12 + endCalendar.get(Calendar.MONTH) - startCalendar.get(Calendar.MONTH);

请注意,如果您的日期是2013-01-31和2013-02-01,则以此方式计算的距离为1个月,这可能是您想要的,也可能不是。


2
+1 这将适用于每年的差异。(即) Startdate = 2014-04-03 enddate = 2013-04-03 结果应该是12,正如OP所说。 更新 是的,即使只有1天的差异,他也会得到1个月的差异,但OP指定他想要以月为单位。1个月并不是这些日期之间的真实差异,但0甚至更不是真实差异。因此,如果您想要0个月,可以使用Math.floor或类似的东西。 - DaGLiMiOuX
1
@ashu startCalendar(int) 不是一个方法。你的语法有错误,也许是这样的。你需要使用startCalendar.setTime(int)。在这种情况下,intstartDate.getTime()。因此,你需要在你的代码中加入 startCalendar.setTime(startDate.getTime()) - DaGLiMiOuX
1
抱歉,我在那里犯了一个语法错误。 - ashu
@ashu 确实,我在回答中打错了一个字,现已更正。 - Étienne Miret
@EtienneMiret 我的意思是 long 而不是 int。我的错 :) - DaGLiMiOuX
显示剩余5条评论

4
你可以使用Java的Joda time库。使用它来计算日期之间的时间差会更容易。
以下是计算时间差的示例代码片段:
Days d = Days.daysBetween(startDate, endDate);
int days = d.getDays();

2
FYI,Joda-Time项目现在处于维护模式,其团队建议迁移到java.time类。 - Basil Bourque

-6
你可以尝试这个:
Calendar sDate = Calendar.getInstance();
Calendar eDate = Calendar.getInstance();
sDate.setTime(startDate.getTime());
eDate.setTime(endDate.getTime());
int difInMonths = sDate.get(Calendar.MONTH) - eDate.get(Calendar.MONTH);

我认为这应该可以工作。我在我的项目中使用了类似的东西,并且对我所需的(年份差异)起作用。您可以从Date获取一个Calendar,然后只需获取月份差异。


13
如果这两个日期属于不同的年份,那么它将无法工作。 - Étienne Miret
1
@EtienneMiret 这是真的。这仅适用于同一年份的日期。 - DaGLiMiOuX
我建议删除这个答案,因为它没有被正确地实现,而且目前已经过时了。 - Nowhere Man
@AlexRudenko如果你要抱怨一个7年前的答案,那么你有一个严重的问题。哈哈。 - DaGLiMiOuX
无论我是否有问题,都无法改善此答案,因为它与桶陈白兰地并不完全相同,因此它在这7年里并没有变得更好 :) - Nowhere Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接