两个日期之间的天数错误值

Wrong value of Days between two Dates

我正在计算两个日期之间的天数,但无法得到正确的结果。 我做了和别人描述的一样的事情。

我的结果应该是 intlong。对于这个例子,我会 expext 11 但 10 也可以。

这是代码:

String startDate = "2018-03-25";
String endDate = "2018-04-05";
Date startDate1 = stringToDate(startDate);
Date endDate1 = stringToDate(endDate);

long ab = daysBetween(startDate1, endDate1);
String ab1 = String.valueOf(ab);

这就是方法:

public static long daysBetween(Date startDate, Date endDate) {
    Calendar sDate = getDatePart(startDate);
    Calendar eDate = getDatePart(endDate);

    long daysBetween = 0;
    while (sDate.before(eDate)) {
        sDate.add(Calendar.DAY_OF_MONTH, 1);
        daysBetween++;
    }
    return daysBetween;
}

public Date stringToDate(String stringDatum) {
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

    try {
        Date date = format.parse(stringDatum);
        return date;
    }
    catch (ParseException e) {
        e.printStackTrace();
    }
    return null;
}

public static Calendar getDatePart(Date date){
    Calendar cal = Calendar.getInstance();       // get calendar instance
    cal.setTime(date);
    cal.set(Calendar.HOUR_OF_DAY, 0);            // set hour to midnight
    cal.set(Calendar.MINUTE, 0);                 // set minute in hour
    cal.set(Calendar.SECOND, 0);                 // set second in minute
    cal.set(Calendar.MILLISECOND, 0);            // set millisecond in second

    return cal;                                   // return the date part
}
private static long daysBetween(Date date1, Date date2){
    return (date2.getTime() - date1.getTime())  / (60*60*24*1000);
}

java.util.DateCalendarSimpleDateFormat 是可怕的 API 的一部分。他们使 date/time 处理工作变得比现在更难。

帮自己一个忙,使用一个像样的 date/time 库:https://github.com/JakeWharton/ThreeTenABP - here's a nice tutorial on how to use it -

有了这个API,做你想做的事就这么容易了:

LocalDate startDate = LocalDate.parse("2018-03-25");
LocalDate endDate = LocalDate.parse("2018-04-05");

long daysBetween = ChronoUnit.DAYS.between(startDate, endDate); // 11

根据您的代码,我选择使用 LocalDate:输入只有日、月和年,而您将 hour/minute/seconds 设置为零,所以我知道您不关心一天中的时间来计算差异 - 这使得 LocalDate 成为最佳选择。

DateCalendar 表示特定时间点,Calendar 也使用时区,因此夏令时更改可能会影响结果,具体取决于设备的默认时区。使用 LocalDate 可以避免这个问题,因为这个 class 没有时区。

但是无论如何,我测试了你的代码,结果也是 11,所以不清楚你面临的问题。