计算天数差异时出现问题

时间:2018-07-13 10:47:32

标签: java date gregorian-calendar

我对编码还很陌生,所以这可能是一个愚蠢的问题,但是我找不到任何解决方案。我想计算日期之间的差异(以天为单位)。它在大多数时间都有效,但是当月份改变时,我会得到奇怪的解决方案。
第一个示例:
今天-2018年9月30日= 78天,
今天-2018年9月31日= 79天(??),
今天- 2018年10月1日= 80天
第二个例子:
今天-2018年8月31日= 49天,
今天-2018年9月1日= 49天

代码

private static int[] abstandTage(GregorianCalendar date1, ArrayList<GregorianCalendar> csvDate)
{
    int[] abstand = new int[csvDate.size()];
    int i = 0;
    while ( i < csvDate.size() )
    {
        long diffInMillis = csvDate.get(i).getTimeInMillis() - date1.getTimeInMillis();
        long tage = diffInMillis / 1000 / 60 / 60 / 24;
        abstand[i] = (int) tage;
        i++ ;
    }

    return abstand;
}

date1是预定义的Date,csvDate是带有日期的列表。有人可以帮我吗?

预先感谢 亚历克斯

3 个答案:

答案 0 :(得分:1)

可以使用ChronoUnit计算差异数组。您还可以使用流进一步简化实现:

private static int[] abstandTage(GregorianCalendar date1,
          ArrayList<GregorianCalendar> csvDate) {

    return csvDate.stream()
            .mapToInt(csvdate -> (int) 
               ChronoUnit.DAYS.between(date1.toZonedDateTime(), csvdate.toZonedDateTime()))
            .toArray();
}

答案 1 :(得分:1)

如果您创建GregorianCalendar对象,例如7月13日的new GregorianCalendar(2018, 7, 13),则会发生这种情况。GregorianCalendar使用了一个怪异的月份编号,因此您没有得到7月13日。

解决方案是扔掉那些早已过时且设计不佳的课程,并使用LocalDate.of(2018, 7, 13)甚至更好的LocalDate.of(2018, Month.JULY, 13)创建日期。然后使用ChronoUnit.DAYS.between查找日期之间的天数。

链接: Oracle tutorial: Date Time解释了如何使用现代Java日期和时间API java.time

答案 2 :(得分:0)

如上所述,您将必须在此处使用 LocalDate

SimpleDateformat sdf = new SimpleDateFormat("yyyyMMdd");
Date date1 = sdf.parse("20180713);
Date date2 = sdf.parse("20180930");
LocalDate startDate = 
date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate endDate = 
date2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
long days = ChronoUnit.DAYS.between(startDate, endDate);
return days;

从公历到日期的转换是通过以下方式完成的:

Date newDate = new Date(date1.getTime());