如何从指定起始日期生成指定天数的日期列表?
嘿,我来帮你搞定这个日期列表生成的问题!首先先梳理下你的需求:从给定的startDate开始,生成包含howManyDays天的连续日期列表对吧?先看看你现有的代码——思路是对的,但有几个可以优化的地方,而且还有更简洁的实现方式~
先修正你的原有代码
你原来的代码里用到了Days.daysBetween,但其实你根本不需要计算两个日期的间隔,因为你已经明确知道要生成howManyDays天的列表了,直接用这个数值作为循环次数就好。另外,Java 8+的LocalDate有更直观的plusDays方法,替代withFieldAdded会让代码更易读:
import java.time.LocalDate; import java.util.ArrayList; import java.util.List; public class DateGenerator { public static List<LocalDate> generateDateList(LocalDate startDate, int howManyDays) { List<LocalDate> dates = new ArrayList<>(howManyDays); // 初始化容量,提升性能 for (int i = 0; i < howManyDays; i++) { LocalDate currentDate = startDate.plusDays(i); dates.add(currentDate); } return dates; } }
这段代码逻辑完全正确:从起始日期开始,依次加上0天、1天……直到howManyDays-1天,生成连续的日期列表。
更优雅的Java 8+流式实现
如果你想用Java 8的Stream API简化代码,可以试试这个写法,更简洁也更符合现代Java的风格:
import java.time.LocalDate; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; public class DateGenerator { public static List<LocalDate> generateDateList(LocalDate startDate, int howManyDays) { return IntStream.range(0, howManyDays) .mapToObj(startDate::plusDays) .collect(Collectors.toList()); } }
用IntStream.range生成0到howManyDays-1的整数流,每个整数对应起始日期加上i天,最后直接收集成列表,一行核心逻辑就能搞定。
额外注意:字符串日期的解析
你提到startDate的示例是29/04/2018,如果你的输入是这种字符串格式的日期,需要先把它解析成LocalDate对象:
import java.time.format.DateTimeFormatter; // 解析dd/MM/yyyy格式的字符串为LocalDate LocalDate startDate = LocalDate.parse("29/04/2018", DateTimeFormatter.ofPattern("dd/MM/yyyy"));
关于你原有代码的验证
其实你原来的代码如果把days替换成howManyDays,也是可以运行的,但withFieldAdded(DurationFieldType.days(), i)是Joda Time库的写法,如果你用的是Java 8+的标准库,更推荐用java.time包下的API,不需要额外引入依赖,代码也更直观。
内容的提问来源于stack exchange,提问作者haruki.phoenyx

