使用正确的日期时间对象:YearMonth
不要将日期作为字符串存储在列表中。就像您int
用于数字和boolean
布尔值(我希望!)一样,使用正确的日期时间对象来表示日期和时间。对于您的用例,YearMonth
该类是合适的。
正如很容易将 anint
格式化为带有或不带千位分隔符的格式以及将 a 格式化boolean
为yes或no一样,例如,将YearMonth
对象格式化为字符串是微不足道的。所以当你需要一个字符串时这样做,而不是之前。
扩展此类对象列表的方法YearMonth
是:
public static void extendDateList(List<YearMonth> dates, int numberOfNewDates) {
if (dates.isEmpty()) {
throw new IllegalArgumentException("List is empty; don’t know where to pick up");
// Or may start from some fixed date or current month
} else {
YearMonth current = Collections.max(dates);
for (int i = 0; i < numberOfNewDates; i++) {
current = current.plusMonths(1);
dates.add(current);
}
}
}
让我们试一试:
List<YearMonth> dates = new ArrayList<YearMonth>(List.of(
YearMonth.of(2020, Month.AUGUST),
YearMonth.of(2020, Month.SEPTEMBER),
YearMonth.of(2020, Month.OCTOBER)));
extendDateList(dates, 3);
System.out.println(dates);
输出是:
[2020-08, 2020-09, 2020-10, 2020-11, 2020-12, 2021-01]
格式化成字符串
我答应过你,你可以很容易地得到你的琴弦。我建议使用上面印有连字符的格式,原因有两个:(1) 它更具可读性,(2) 它是国际标准 ISO 8601 格式。无论如何,为了证明您可以按照自己的方式拥有它,我使用格式化程序来生成您使用的无连字符格式:
private static final DateTimeFormatter YEAR_MONTH_FORMATTER
= DateTimeFormatter.ofPattern("uuuuMM");
现在转换为字符串列表是单行的(如果您的编辑器窗口足够宽):
List<String> datesAsStrings = dates.stream()
.map(YEAR_MONTH_FORMATTER::format)
.collect(Collectors.toList());
System.out.println(datesAsStrings);
[202008, 202009, 202010, 202011, 202012, 202101]
链接