从给定日期查找所有过帐日期(会计)
Find all posting dates (accounting) from a given date
我正在处理一份会计报告,其中一份报告需要列出自给定日期起过去四个星期内的所有 post 日期。
A post 日期是一周的最后一天,在我们的例子中是星期天
或该月的最后一天。
例如。如果我输入 12/1/2019,那么我将列出以下列表:
- 第 1 周:12/01/2019 - 12/01/2019
- 第 1 周:2019 年 11 月 25 日 - 2019 年 11 月 30 日
- 第 2 周:2019 年 11 月 18 日 - 2019 年 11 月 24 日
- 第 3 周:2019 年 11 月 11 日 - 2019 年 11 月 17 日
- 第 4 周:11/04/2019 - 11/10/2019
如您所见,有 5 个 post 日期。有时有 4 周。
这里有 4 个 post 日期的示例:2019 年 10 月 27 日结束
- 第 1 周:2019 年 10 月 21 日 - 2019 年 10 月 27 日
- 第 2 周:10/14/2019 - 10/20/2019
- 第 3 周:10/07/2019 - 10/13/2019
- 第 4 周:10/01/2019 - 10/06/2019
输入值始终为星期日,即周末。
我想知道是否有一个经过测试的库已经具有这种功能,而不是编写我自己的逻辑来处理日期。
java.time
我怀疑经过测试的库能否准确提供您所要求的内容,尽管您可以使用搜索引擎试试运气。使用 java.time,现代 Java 日期和时间 API,自己编写代码并不难。有很多方法可以解决这个问题。以下内容对我来说很自然:
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 个 post 日期的示例:
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]
Link: Oracle tutorial: Date Time 解释如何使用 java.time.
我正在处理一份会计报告,其中一份报告需要列出自给定日期起过去四个星期内的所有 post 日期。
A post 日期是一周的最后一天,在我们的例子中是星期天 或该月的最后一天。
例如。如果我输入 12/1/2019,那么我将列出以下列表:
- 第 1 周:12/01/2019 - 12/01/2019
- 第 1 周:2019 年 11 月 25 日 - 2019 年 11 月 30 日
- 第 2 周:2019 年 11 月 18 日 - 2019 年 11 月 24 日
- 第 3 周:2019 年 11 月 11 日 - 2019 年 11 月 17 日
- 第 4 周:11/04/2019 - 11/10/2019
如您所见,有 5 个 post 日期。有时有 4 周。
这里有 4 个 post 日期的示例:2019 年 10 月 27 日结束
- 第 1 周:2019 年 10 月 21 日 - 2019 年 10 月 27 日
- 第 2 周:10/14/2019 - 10/20/2019
- 第 3 周:10/07/2019 - 10/13/2019
- 第 4 周:10/01/2019 - 10/06/2019
输入值始终为星期日,即周末。
我想知道是否有一个经过测试的库已经具有这种功能,而不是编写我自己的逻辑来处理日期。
java.time
我怀疑经过测试的库能否准确提供您所要求的内容,尽管您可以使用搜索引擎试试运气。使用 java.time,现代 Java 日期和时间 API,自己编写代码并不难。有很多方法可以解决这个问题。以下内容对我来说很自然:
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 个 post 日期的示例:
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]
Link: Oracle tutorial: Date Time 解释如何使用 java.time.