Joda:如何在两个日期之间获得数月和数日

时间:2015-11-09 16:57:25

标签: java android jodatime

我想我在这里遗漏了一些微妙之处,因为我读到的所有内容都说这应该有效。我需要在Android中获得两个日期之间的月份和日期。也就是说,整整几个月加上任何额外的天数。我需要这个作为数字输出,而不是打印字符串。以下是我正在做的事情,使用Joda:

void method(DateTime begin, DateTime end) {
    Period period = Period period = new Period(begin, end);
    final int months = period.getMonths();
    final int additionalDays = period.getDays();

问题是additionalDays始终为零。例如,2015年7月1日到2015年11月29日应该会产生4个月和29天,但我会得到4个月零0天。

2 个答案:

答案 0 :(得分:3)

如果不支持,documentation Period.getDays()将返回0。我不确定为什么不支持,但我想提供不同的方法:使用DaysMonths类及其monthsBetween()daysBetween()方法。请注意,您也必须减去两者之间的月份:

// Get months
int months = Months.monthsBetween(begin, end).getMonths();
// Subtract this number of months from the end date so we can calculate days
DateTime newEnd = end.minusMonths(months);
// Get days
int days = Days.daysBetween(begin, newEnd).getDays();

如果您没有在中间进行此减法,那么您将获得不正确的结果,因为您将所有天。

答案 1 :(得分:2)

您使用的Period构造函数的javadoc

new Period(begin, end);

状态

  

使用标准从给定的间隔端点创建一个句点   一组字段。

换句话说,它相当于

Period period = new Period(startTime, endTime, PeriodType.standard());

PeriodType#standard()方法返回支持周字段的PeriodType

您的期限<2015年7月1日至2015年11月29日,实际上是4个月28天,其中28天变为4周。所以你的Period对象实际上是4个月零4周。

如果您曾尝试从 2015年7月1日到2015年11月30日创建Period,那么您将有4个月,4周和1天。

相反,请创建一个PeriodPeriodType#yearMonthDay()只支持年,月和日字段。

period = new Period(begin, end, PeriodType.yearMonthDay());

然后你有一个Period,有4个月和28天,因为它不会支持数周。