如何获取两个日历实例之间的天数?

Akr*_*ram 32 java android calendar date

Calendar如果有日期变化,我想找到两个天数之间的差异,如果时间从23:59-0:00开始,则应该有一天的差异.

我写了这个

public static int daysBetween(Calendar startDate, Calendar endDate) {  
    return Math.abs(startDate.get(Calendar.DAY_OF_MONTH)-endDate.get(Calendar.DAY_OF_MONTH));  
} 
Run Code Online (Sandbox Code Playgroud)

但它不起作用,因为它只会在天数差异之间给出差异,如果有月份差异则毫无价值.

Jk1*_*Jk1 32

尝试以下方法:

public static long daysBetween(Calendar startDate, Calendar endDate) {
    long end = endDate.getTimeInMillis();
    long start = startDate.getTimeInMillis();
    return TimeUnit.MILLISECONDS.toDays(Math.abs(end - start));
}
Run Code Online (Sandbox Code Playgroud)

  • 这不是原始问题的正确答案.如果将一天的差异定义为86,400,000毫秒(24小时内的毫秒数),则此答案是正确的.然而,最初的问题要求"如果有日期变化,如果时钟从23:59-0:00滴答,则应该有一天的差异".因此,问题定义了日历日相差1的1天差异. (14认同)
  • 它可能会增加 1。 (2认同)
  • 如何将小时和分钟设置为0,然后再进行差值计算 (2认同)

Moh*_*s A 23

在Java 8及更高版本中,我们可以简单地使用java.time类.

hoursBetween = ChronoUnit.HOURS.between(calendarObj.toInstant(), calendarObj.toInstant());

daysBetween = ChronoUnit.DAYS.between(calendarObj.toInstant(), calendarObj.toInstant());
Run Code Online (Sandbox Code Playgroud)

  • 也可以在Java 8之前使用。在[*** ThreeTen-Backport ***](http://www.threeten.org/中,许多java.time功能都被反向移植到Java 6和Java 7。 threetenbp /)项目。在[*** ThreeTenABP ***](https://github.com/JakeWharton/ThreeTenABP)项目中进一步适用于Android。 (3认同)

sta*_*010 8

此函数计算两个日历之间的天数,作为它们之间的月份日历天数,这是OP想要的.通过计算两个日历被设置为各自日期的午夜之后的日历之间的多少86,400,000毫秒来执行计算.

例如,我的函数将计算1月1日晚上11:59和1月2日12:01 AM之间1天的差异.

import java.util.concurrent.TimeUnit;

/**
 * Compute the number of calendar days between two Calendar objects. 
 * The desired value is the number of days of the month between the
 * two Calendars, not the number of milliseconds' worth of days.
 * @param startCal The earlier calendar
 * @param endCal The later calendar
 * @return the number of calendar days of the month between startCal and endCal
 */
public static long calendarDaysBetween(Calendar startCal, Calendar endCal) {

    // Create copies so we don't update the original calendars.

    Calendar start = Calendar.getInstance();
    start.setTimeZone(startCal.getTimeZone());
    start.setTimeInMillis(startCal.getTimeInMillis());

    Calendar end = Calendar.getInstance();
    end.setTimeZone(endCal.getTimeZone());
    end.setTimeInMillis(endCal.getTimeInMillis());

    // Set the copies to be at midnight, but keep the day information.

    start.set(Calendar.HOUR_OF_DAY, 0);
    start.set(Calendar.MINUTE, 0);
    start.set(Calendar.SECOND, 0);
    start.set(Calendar.MILLISECOND, 0);

    end.set(Calendar.HOUR_OF_DAY, 0);
    end.set(Calendar.MINUTE, 0);
    end.set(Calendar.SECOND, 0);
    end.set(Calendar.MILLISECOND, 0);

    // At this point, each calendar is set to midnight on 
    // their respective days. Now use TimeUnit.MILLISECONDS to
    // compute the number of full days between the two of them.

    return TimeUnit.MILLISECONDS.toDays(
            Math.abs(end.getTimeInMillis() - start.getTimeInMillis()));
}
Run Code Online (Sandbox Code Playgroud)


小智 5

扩展@JK1 很好的答案:

public static long daysBetween(Calendar startDate, Calendar endDate) {

    //Make sure we don't change the parameter passed
    Calendar newStart = Calendar.getInstance();
    newStart.setTimeInMillis(startDate.getTimeInMillis());
    newStart.set(Calendar.HOUR_OF_DAY, 0);
    newStart.set(Calendar.MINUTE, 0);
    newStart.set(Calendar.SECOND, 0);
    newStart.set(Calendar.MILLISECOND, 0);

    Calendar newEnd = Calendar.getInstance();
    newEnd.setTimeInMillis(endDate.getTimeInMillis());
    newEnd.set(Calendar.HOUR_OF_DAY, 0);
    newEnd.set(Calendar.MINUTE, 0);
    newEnd.set(Calendar.SECOND, 0);
    newEnd.set(Calendar.MILLISECOND, 0);

    long end = newEnd.getTimeInMillis();
    long start = newStart.getTimeInMillis();
    return TimeUnit.MILLISECONDS.toDays(Math.abs(end - start));
}
Run Code Online (Sandbox Code Playgroud)