如何使用日历api查找java中两个日期范围之间的月数

Joh*_*ohn 1 java

我有两个约会(01/01/2012,2014年7月31日).

你能帮我计算这两个日期之间的月差.如果差异是8个月1天我需要结果9个月.

Md.*_*man 9

Working Code:

public int monthsBetweenDates(Date startDate, Date endDate){

        Calendar start = Calendar.getInstance();
        start.setTime(startDate);

        Calendar end = Calendar.getInstance();
        end.setTime(endDate);

          int monthsBetween = 0;
            int dateDiff = end.get(Calendar.DAY_OF_MONTH)-start.get(Calendar.DAY_OF_MONTH);      

if(dateDiff<0) {
                int borrrow = end.getActualMaximum(Calendar.DAY_OF_MONTH);           
                 dateDiff = (end.get(Calendar.DAY_OF_MONTH)+borrrow)-start.get(Calendar.DAY_OF_MONTH);
                 monthsBetween--;

if(dateDiff>0) {
                     monthsBetween++;
                 }
            }
            else {
                monthsBetween++;
            }      
            monthsBetween += end.get(Calendar.MONTH)-start.get(Calendar.MONTH);      
            monthsBetween  += (end.get(Calendar.YEAR)-start.get(Calendar.YEAR))*12;      
            return monthsBetween;
     }
Run Code Online (Sandbox Code Playgroud)


Ell*_*sch 6

你可以使用Calendar像,

static int monthsBetween(Date a, Date b) {
    Calendar cal = Calendar.getInstance();
    if (a.before(b)) {
        cal.setTime(a);
    } else {
        cal.setTime(b);
        b = a;
    }
    int c = 0;
    while (cal.getTime().before(b)) {
        cal.add(Calendar.MONTH, 1);
        c++;
    }
    return c - 1;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样称呼它

public static void main(String[] args) {
    String start = "01/01/2012";
    String end = "31/07/2014";
    DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    try {
        System.out.println(monthsBetween(sdf.parse(start), sdf.parse(end)));
    } catch (ParseException e) {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是

30
Run Code Online (Sandbox Code Playgroud)

或者,使用Joda-Time

String start = "01/01/2012";
String end = "31/07/2014";
DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
try {
    LocalDate a = LocalDate.fromDateFields(sdf.parse(start));
    LocalDate b = LocalDate.fromDateFields(sdf.parse(end));
    Period p = new Period(a, b);
    System.out.println((p.getYears() * 12) + p.getMonths());
} catch (ParseException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

输出也是

30
Run Code Online (Sandbox Code Playgroud)

编辑

最后(如评论中所述),如果您使用的是Java 8,则可以使用新的java.time

String start = "01/01/2012";
String end = "31/07/2014";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate from = LocalDate.parse(start, formatter);
LocalDate to = LocalDate.parse(end, formatter);
System.out.println(from.until(to, ChronoUnit.MONTHS));
Run Code Online (Sandbox Code Playgroud)

输出是(仍)

30
Run Code Online (Sandbox Code Playgroud)