dateDiff

2つの日付の間隔を取得する。

public static long dateDiff(Date d1, Date d2, int field) {
    Calendar c1 = Calendar.getInstance();
    Calendar c2 = Calendar.getInstance();
    c1.setTime(d1);
    c2.setTime(d2);
    switch (field) {
    case Calendar.YEAR:
        return diffYear(c1, c2);
    case Calendar.MONTH:
        return diffMonth(c1, c2);
    case Calendar.DATE:
        return diffDay(c1, c2);
    case Calendar.HOUR_OF_DAY:
        return diffHour(c1, c2);
    case Calendar.MINUTE:
        return diffMinute(c1, c2);
    case Calendar.SECOND:
        return diffSecond(c1, c2);
    default:
        throw new UnsupportedOperationException();
    }
}

private static long diffYear(Calendar c1, Calendar c2) {
    return c2.get(Calendar.YEAR) - c1.get(Calendar.YEAR);
}

private static long diffMonth(Calendar c1, Calendar c2) {
    return diffYear(c1, c2) * 12 + c2.get(Calendar.MONTH) - c1.get(Calendar.MONTH);
}

private static long diffDay(Calendar c1, Calendar c2) {
    c1.set(Calendar.HOUR_OF_DAY, 0);
    c1.set(Calendar.MINUTE, 0);
    c1.set(Calendar.SECOND, 0);
    c2.set(Calendar.HOUR_OF_DAY, 0);
    c2.set(Calendar.MINUTE, 0);
    c2.set(Calendar.SECOND, 0);
    return (c2.getTimeInMillis() - c1.getTimeInMillis()) / 86400000L;
}

private static long diffHour(Calendar c1, Calendar c2) {
    int h1 = c1.get(Calendar.HOUR_OF_DAY);
    int h2 = c2.get(Calendar.HOUR_OF_DAY);
    return diffDay(c1, c2) * 24 + h2 - h1;
}

private static long diffMinute(Calendar c1, Calendar c2) {
    int m1 = c1.get(Calendar.MINUTE);
    int m2 = c2.get(Calendar.MINUTE);
    return diffHour(c1, c2) * 60 + m2 - m1;
}

private static long diffSecond(Calendar c1, Calendar c2) {
    int s1 = c1.get(Calendar.SECOND);
    int s2 = c2.get(Calendar.SECOND);
    return diffMinute(c1, c2) * 60 + s2 - s1;
}