作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试为 Period 中的每一年获取一个 LocalDate 实例。例如,为此:
LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(2011, Month.DECEMBER, 19);
Period period = Period.between(birthday, today);
我想要 2012-12-19、2013-12-19、2014-12-19、2015-12-19
。鉴于 Period
的方法,这是不可能的。有没有解决的办法?是否可以使用其他方法?
最佳答案
循环日期时必须小心。 “明显”的解决方案无法正常工作。 Soorapadman 的解决方案在给定日期(12 月 19 日)可以正常工作,但如果开始日期是 2 月 29 日,则会失败。这是因为1年后是28日,即使再有一个闰年,日期也永远不会回到2月29日。
请注意,这个问题在添加月份时更为明显。 1 月 31 日的开始日期将返回 2 月 28 日(或 29 日)的序列,然后是 3 月 28 日和 4 月 28 日,依此类推。这不太可能是所需的输出,可能是每个月的最后一天。
正确的策略如下:
public List<LocalDate> datesBetween(LocalDate start, LocalDate end, Period period);
List<LocalDate> list = new ArrayList<>();
int multiplier = 1;
LocalDate current = start;
while (!current.isAfter(end)) {
current = start.plus(period.multipliedBy(multiplier);
list.add(current);
multiplier++;
}
return list;
}
请注意该策略如何向相同 开始日期添加递增期。开始日期永远不会改变。使用相同的开始日期对于保持该日期的正确月份长度至关重要。
关于java - 在java中获取 Period 中的每一年,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34367618/
我是一名优秀的程序员,十分优秀!