1.概述
Java 8中引入的新Time API使得可以在不使用外部库的情况下处理日期和时间。
在这个本篇教程中,你将会了解如何在不同版本的Java中获取两个日期之间的所有日期。
2. 使用Java 7
在Java 7中,我们可以使用Calendar实例,使用循环并在每次迭代中使用add方法和Calendar.Date字段添加1天它直到达结束日期。
使用Calendar实例:public static List getDatesBetweenUsingJava7(Date startDate, Date endDate) { List datesInRange = new ArrayList(); Calendar calendar = new GregorianCalendar(); calendar.setTime(startDate); Calendar endCalendar = new GregorianCalendar(); endCalendar.setTime(endDate); while (calendar.before(endCalendar)) { Date result = calendar.getTime(); datesInRange.add(result); calendar.add(Calendar.DATE, 1); } return datesInRange;}
我们来测试一下@Testpublic void test_getDatesBetweenUsingJava7() { Date startDate = Calendar.getInstance().getTime(); Calendar endCalendar = Calendar.getInstance(); // 加了两天 endCalendar.add(Calendar.DATE, 2); Date endDate = endCalendar.getTime(); List dates = DatesBetweenTwoDate.getDatesBetweenUsingJava7(startDate, endDate); assertEquals(dates.size(), 2); Calendar calendar = Calendar.getInstance(); Date date1 = calendar.getTime(); // 我们这里为了简单,就直接使用过期的API了 assertEquals(dates.get(0).getDay(), date1.getDay()); assertEquals(dates.get(0).getMonth(), date1.getMonth()); assertEquals(dates.get(0).getYear(), date1.getYear()); calendar.add(Calendar.DATE, 1); Date date2 = calendar.getTime(); assertEquals(dates.get(1).getDay(), date2.getDay()); assertEquals(dates.get(1).getMonth(), date2.getMonth()); assertEquals(dates.get(1).getYear(), date2.getYear());}
3. 使用Java 8
在Java 8中,可以创建一个连续的无限日期流,我们只是使用我们想要的部分。不幸的是,没有终止无限流的方法。
所以我们需要计算这日期之间的天数,然后简单地使用limit() 方法来限制流:public static List 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());}
简单的看一下上面的代码,首先,通过与ChronoUnit枚举的DAYS常量,使用between函数来获取两个日期之间的天数。
然后我们创建一个整数流,表示自开始日期以来的天数。
然后,我们使用plusDays() API 将整数转换为LocalDate对象。
最后,我们将所有内容收集到List中。
我们来测试一下@Testpublic void test_getDatesBetweenUsingJava8() { LocalDate startDate = LocalDate.now(); LocalDate endDate = LocalDate.now().plusDays(2); List dates = DatesBetweenTwoDate.getDatesBetweenUsingJava8(startDate, endDate); assertEquals(dates.size(), 2); assertEquals(dates.get(0), LocalDate.now()); assertEquals(dates.get(1), LocalDate.now().plusDays(1));}
4. 使用Java 9
Java 9中带来了专门的计算天数的方法:public static List getDatesBetweenUsingJava9(LocalDate startDate, LocalDate endDate) { return startDate.datesUntil(endDate).collect(Collectors.toList());}
我们可以使用LocalDate类的datesUntil方法来获取两个日期之间的日期。
该datesUntill返回正常顺序的LocalDate的流,我们需要自己进行收集。
5.结论
在这个本篇教程中,我们研究了如何在不同版本的Java中获取两个日期之间的所有日期。
大体有三种:Java 7之前,使用Calendar对象的add方法,进行迭代。
Java 8中,我们可以ChronoUnit.DAYS的between方法,获取相差的天数,然后使用流将日期转为List。
Java 9中,我们可以直接使用datesUntil来计算。
最后,往常一样,代码可以在Github上找到。