我正在处理会计报告,其中一份报告要求列出给定日期后最近四个星期内的所有过帐日期。
发布日期是一周的最后一天,在我们的情况下是星期天
或每月的最后一天。
例如。如果我输入12/1/2019,则将列出以下列表:
第一周:12/01/2019-12/01/2019
第一周:11/25/2019-11/30/2019
第2周:11/18/2019-11/24/2019
第三周:11/11/2019-11/17/2019
第四周:11/04/2019-11/10/2019
如您在此处看到的,有5个发布日期。有时有4周。
这是4个发布日期的示例:结束一周10/27/2019
第一周:10/21/2019-10/27/2019
第二周:10/14/2019-10/20/2019
第三周:10/07/2019-10/13/2019
第4周:10/01/2019-10/06/2019
输入值将始终为星期日,即一周的结束时间。
我想知道是否有一个经过测试的库已经具有这种功能,而不是编写自己的逻辑来处理日期。
最佳答案
java.time
我怀疑经过测试的库是否能满足您的要求,尽管您可能会在搜索引擎中碰碰运气。使用现代的Java日期和时间API java.time,您可以自己编写代码。有许多解决方法。以下内容对我来说很自然:
public static List<LocalDate> getPostDates(LocalDate endDate) {
DayOfWeek dow = endDate.getDayOfWeek();
if (! dow.equals(DayOfWeek.SUNDAY)) {
throw new IllegalArgumentException("End date must be Sunday, was " + dow);
}
List<LocalDate> result = new ArrayList<>(5);
for (int week = 1; week <= 4; week++) {
LocalDate lastDayOfWeek = endDate.minusWeeks(week - 1);
result.add(lastDayOfWeek);
// If the week crosses a month boundary, also add last day of month
int dom = lastDayOfWeek.getDayOfMonth();
if (dom < 7) {
result.add(lastDayOfWeek.minusDays(dom));
}
}
return result;
}
让我们用两个示例日期进行尝试:
System.out.println(getPostDates(LocalDate.of(2019, Month.DECEMBER, 1)));
System.out.println(getPostDates(LocalDate.of(2019, Month.OCTOBER, 27)));
输出为:
[2019-12-01, 2019-11-30, 2019-11-24, 2019-11-17, 2019-11-10]
[2019-10-27, 2019-10-20, 2019-10-13, 2019-10-06, 2019-09-30]
我注意到最后一个例子是9月30日,您的问题中没有提到。不过,它是从10月27日起的最后四个星期内,并且已经是一个月了,所以我认为这是正确的吗?
仅有4个发布日期的示例:
System.out.println(getPostDates(LocalDate.of(2019, Month.SEPTEMBER, 29)));
System.out.println(getPostDates(LocalDate.of(2019, Month.JULY, 14)));
[2019-09-29, 2019-09-22, 2019-09-15, 2019-09-08]
[2019-07-14, 2019-07-07, 2019-06-30, 2019-06-23]
链接:Oracle tutorial: Date Time解释如何使用java.time。
关于java - 查找给定日期的所有过帐日期(会计),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59145682/