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

时间:2018-03-27 17:26:05

标签: java android date date-difference

我试图计算两个日期之间的日子,但我无法得到正确的结果。 我做了同样有人向我描述的事情。

我的结果应该是intlong。对于这个例子,我将exxt 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
}

2 个答案:

答案 0 :(得分:4)

java.util.DateCalendarSimpleDateFormat是可怕API的一部分。他们使日期/时间处理的工作比现在更难。

帮自己一个忙,并使用一个不错的日期/时间库:https://github.com/JakeWharton/ThreeTenABP - 这是一个关于如何使用它的好教程 - How to use ThreeTenABP in Android Project

使用此API,您可以轻松完成所需的操作:

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

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

我已根据您的代码选择使用LocalDate:输入只有日,月和年,并且您将小时/分钟/秒设置为零,所以我理解你不在乎计算差异的时间 - 这使LocalDate成为最佳选择。

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

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

答案 1 :(得分:-1)

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