【问题标题】:Find all posting dates (accounting) from a given date查找给定日期的所有过帐日期(会计)
【发布时间】:2019-12-02 19:44:43
【问题描述】:

我正在编写一份会计报告,其中一份报告需要列出从给定日期算起的过去 4 周内的所有发布日期。

发布日期是一周的最后一天,在我们的例子中是星期日 或当月的最后一天。

例如。如果我输入 2019 年 12 月 1 日,那么我将列出以下列表:

  • 第 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 个发布日期。有时有 4 周。

以下是 4 个发布日期的示例:结束周 10/27/2019

  • 第 1 周:10/21/2019 - 10/27/2019
  • 第 2 周:2019 年 10 月 14 日 - 2019 年 10 月 20 日
  • 第 3 周:10/07/2019 - 10/13/2019
  • 第 4 周:10/01/2019 - 10/06/2019

输入值将始终为星期日,即周末。

我想知道是否有一个经过测试的库已经具有这种功能,而不是编写我自己的逻辑来处理日期。

【问题讨论】:

  • 此问题的答案提供了执行此操作的代码:stackoverflow.com/a/30966945/217269
  • 不完全是,@spork,但工作量很大。感谢您提供绝对有用的链接。

标签: java date accounting


【解决方案1】:

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 周内,而且是月底,所以我认为它是正确的?

只有 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 8)java.time API。感谢您指出这一点!
猜你喜欢
  • 2021-12-31
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 2014-07-09
相关资源
最近更新 更多