2个java.util.Date之间的月数,不包括日期

Fil*_*lip 5 java date jodatime

我想要2个月之间的java.util.Date月数,而不计算月份的日期.所以我只想比较年份和月份.

例:

 monthsBetween(new Date(2012,01,28), new Date(2012,02,01)) ---> 1

 monthsBetween(new Date(2012,02,27), new Date(2012,02,28)) ---> 0

 monthsBetween(new Date(2012,03,28), new Date(2012,07,01)) ---> 4
Run Code Online (Sandbox Code Playgroud)

我试过这个(返回0,预期1),使用Joda-time:

private static int monthsBetween(final Date fromDate, final Date toDate) {
    DateTime date1 = new DateTime().withDate(2012, 1, 20);
    DateTime date2 = new DateTime().withDate(2012, 2, 13);
    PeriodType monthDay = PeriodType.yearDayTime().withDaysRemoved();
    Period difference = new Period(date1, date2, monthDay);
    int months = difference.getMonths();

    return months;
 }
Run Code Online (Sandbox Code Playgroud)

而且这个(相同的结果),使用Joda-time:

private static int monthsBetween(final Date fromDate, final Date toDate) {
        return Months.monthsBetween(new DateTime(fromDate), new   DateTime(toDate).getMonths();
    }
Run Code Online (Sandbox Code Playgroud)

我怎么能做到这一点?

Jon*_*eet 8

你要求整月的数量 - 这与说"忽略月份部分"不同.

首先,我建议使用LocalDate而不是DateTime计算.理想情况下,根本不要使用java.util.Date,并从输入LocalDate开始(例如,通过直接解析文本或数据来自哪里.)在两个日期中将月中的日期设置为1,然后取差几个月:

private static int monthsBetweenIgnoreDays(LocalDate start, LocalDate end) {
    start = start.withDayOfMonth(1);
    end = end.withDayOfMonth(1);
    return Months.monthsBetween(start, end).getMonths();
}
Run Code Online (Sandbox Code Playgroud)


Evg*_*eev 5

此版本基于JDK Calendar:

public static void main(String[] args) throws Exception {
    SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
    Date d1 = f.parse("2012-01-01");
    Date d2 = f.parse("2012-02-02");
    int n = differenceInMonths(d1, d2);
    System.out.println(n);
}

private static int differenceInMonths(Date d1, Date d2) {
    Calendar c1 = Calendar.getInstance();
    c1.setTime(d1);
    Calendar c2 = Calendar.getInstance();
    c2.setTime(d2);
    int diff = 0;
    if (c2.after(c1)) {
        while (c2.after(c1)) {
            c1.add(Calendar.MONTH, 1);
            if (c2.after(c1)) {
                diff++;
            }
        }
    } else if (c2.before(c1)) {
        while (c2.before(c1)) {
            c1.add(Calendar.MONTH, -1);
            if (c1.before(c2)) {
                diff--;
            }
        }
    }
    return diff;
}
Run Code Online (Sandbox Code Playgroud)