在新的java.time
应用编程接口中获取两个日期之间的所有日期是否具有可用性?
假设我有这部分代码:
@Test
public void testGenerateChartCalendarData() {
LocalDate startDate = LocalDate.now();
LocalDate endDate = startDate.plusMonths(1);
endDate = endDate.withDayOfMonth(endDate.lengthOfMonth());
}
现在我需要startDate
和endDate
之间的所有日期。
我在考虑获取两个日期的daysBetween
并迭代:
long daysBetween = ChronoUnit.DAYS.between(startDate, endDate);
for(int i = 0; i <= daysBetween; i++){
startDate.plusDays(i); //...do the stuff with the new date...
}
有没有更好的方法来获取日期?
发布于 2016-07-06 19:25:31
假设您主要希望迭代日期范围,那么创建一个可迭代的DateRange
类将是有意义的。这将允许您编写以下代码:
for (LocalDate d : DateRange.between(startDate, endDate)) ...
类似于:
public class DateRange implements Iterable<LocalDate> {
private final LocalDate startDate;
private final LocalDate endDate;
public DateRange(LocalDate startDate, LocalDate endDate) {
//check that range is valid (null, start < end)
this.startDate = startDate;
this.endDate = endDate;
}
@Override
public Iterator<LocalDate> iterator() {
return stream().iterator();
}
public Stream<LocalDate> stream() {
return Stream.iterate(startDate, d -> d.plusDays(1))
.limit(ChronoUnit.DAYS.between(startDate, endDate) + 1);
}
public List<LocalDate> toList() { //could also be built from the stream() method
List<LocalDate> dates = new ArrayList<> ();
for (LocalDate d = startDate; !d.isAfter(endDate); d = d.plusDays(1)) {
dates.add(d);
}
return dates;
}
}
添加equals & hashcode方法,getter,也许有一个静态工厂+私有构造函数来匹配Java time API的编码风格,这将是有意义的。
发布于 2016-07-06 17:35:15
首先,您可以使用TemporalAdjuster
来获取一个月的最后一天。接下来,Stream
API提供了Stream::iterate
,它是解决您的问题的正确工具。
LocalDate start = LocalDate.now();
LocalDate end = LocalDate.now().plusMonths(1).with(TemporalAdjusters.lastDayOfMonth());
List<LocalDate> dates = Stream.iterate(start, date -> date.plusDays(1))
.limit(ChronoUnit.DAYS.between(start, end))
.collect(Collectors.toList());
System.out.println(dates.size());
System.out.println(dates);
发布于 2018-06-21 21:21:10
Java 9
在Java9中,使用LocalDate.datesUntil(LocalDate endExclusive)方法增强了LocalDate
类,该方法将日期范围内的所有日期作为Stream<LocalDate>
返回。
List<LocalDate> dates = startDate.datesUntil(endDate).collect(Collectors.toList());
https://stackoverflow.com/questions/38220543
复制相似问题