如何获取两个日期之间的所有日期

2025/04/14

1. 概述

Java 8中引入的新时间API使得无需使用外部库即可处理日期和时间。

在这个简短的教程中,我们将了解如何在不同版本的Java中更轻松地获取两个日期之间的所有日期。

2. 使用Java 7

在Java 7中,计算这一点的一种方法是使用Calendar实例。

首先,我们获取不带时间的开始日期和结束日期,然后,我们将循环遍历这些日期,并使用add方法和Calendar.Date字段在每次迭代中增加一天,直到到达结束日期。

下面是使用Calendar实例的演示代码:

public static List getDatesBetweenUsingJava7(Date startDate, Date endDate) {
    List datesInRange = new ArrayList<>();
    Calendar calendar = getCalendarWithoutTime(startDate);
    Calendar endCalendar = getCalendarWithoutTime(endDate);

    while (calendar.before(endCalendar)) {
        Date result = calendar.getTime();
        datesInRange.add(result);
        calendar.add(Calendar.DATE, 1);
    }

    return datesInRange;
}

private static Calendar getCalendarWithoutTime(Date date) {
    Calendar calendar = new GregorianCalendar();
    calendar.setTime(date);
    calendar.set(Calendar.HOUR, 0);
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    return calendar;
}

3. 使用Java 8

在Java 8中,我们现在可以创建一个连续的无限日期流,并只提取相关部分。遗憾的是,当谓词匹配时,无法终止无限流-这就是为什么我们需要计算这两天之间的天数,然后简单地对流进行limit()操作:

public static List<LocalDate> getDatesBetweenUsingJava8(LocalDate startDate, LocalDate endDate) {
    long numOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate); 
    return IntStream.iterate(0, i -> i + 1)
        .limit(numOfDaysBetween)
        .mapToObj(i -> startDate.plusDays(i))
        .collect(Collectors.toList()); 
}

请注意,首先,我们可以使用between函数获取两个日期之间的天数差-与ChronoUnit枚举的DAYS常量相关联。

然后,我们创建一个整数流,表示自开始日期以来的天数。下一步,我们使用plusDays() API将整数转换为LocalDate对象。

最后,我们将所有内容收集到一个列表实例中。

4. 使用Java 9

最后,Java 9带来了专门的方法来计算这个:

public static List<LocalDate> getDatesBetweenUsingJava9(LocalDate startDate, LocalDate endDate) {
    return startDate.datesUntil(endDate)
        .collect(Collectors.toList());
}

我们可以使用LocalDate类的专用datesUntil方法,通过一次方法调用获取两个日期之间的日期。datesUntil返回按顺序排列的日期流,从调用该方法的日期对象开始,到作为方法参数给出的日期为止。

5. 总结

在这篇简短的文章中,我们研究了如何使用不同版本的Java获取两个日期之间的所有日期。

Java 8版本中引入的Time API使对日期文字进行操作变得更容易,而在Java 9中,只需调用datesUntil即可完成。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章