如何计算定义了自定义财务日历的 2 个日期之间的月数?

How to calculate number of months in between 2 dates having custom financial calendar defined?

我有定义自定义财务日历的场景。有时一个月可以是 28 天,有时也可以是 35 天。 每个月的开始都不一样。 (可以从10/15/20开始)

为了引用哪个日历日期指的是哪个财务日期,我定义了一个 table,它具有以下列结构:

在上面table你可以看到fiscalmonth P1指的是日期20190125。(fiscalmonth-P1可能是从2019011520190215

此 table 在数据库中。我正在 java 部分创建功能,该功能将 return Periodbetween 对象基于提供的两个会计日期(将参考上面 [=53= 的 yyyymmdd 列]) 功能。

public class PeriodBetween {

    private int days;
    private int weeks;
    private int months;
    private int quarters;
    private int years;
    //getters & setters
}

periodBetween 对象提供了有关这两个日期之间的 days/weeks/months/quarters 数量的更多信息。 public PeriodBetween between(int startDate, int endDate)

我正在寻找可以构建的东西,例如 Java 的 java.time.Period.between 函数中的内容。但是无法通过参考上面定义的 table 来获得我可以使用的最佳方法。

让我知道是否已经存在这样的东西,或者除了使用 Financial Calendar table.

之外还有其他方法

更新: 有时日历 cab 为 28 天或 35 天的情况是基于客户遵循的日历。因此,根据客户端的不同,Financial Calendar Table 将被填充。

财政日历不是预测的table。它将根据要求预先填充在 table 中。 是的,Fiscal Calendar Table 跟随 52 以及 52 周的支持。因此,为了让您有更高层次的想法,table 将根据客户使用的自定义日历类型进行填充。

我现在如何定义我的日历? 从客户那里获取有关他们希望如何定义日历的要求。我使用它来填充上面提到的 table 并在任何地方使用它 table 。 因此,假设在金融日历上我想找出什么是 3rd day of P3 month on Financial year 2018。 那么我对这个 table 的查询将是提取更多关于这一天的信息:select * from financial_calendar where fiscaldayofmonth=3 and fiscalmonth=P3 and fiscalyear=Financial Year 2018

我计算两个日期之间的月数的想法是使用两个日期之间的子句从 table 中提取信息并将数据大小除以 30。这是不正确的。

AccountingChronology

java.time 框架在 Java 8 及更高版本中默认使用基于 ISO 8601. However, that chronology is pluggable 的年表。

捆绑了其他四个年表实现:Hijrah、Japanese、Minguo 和 ThaiBuddhist。这些是 java.time.chrono.Chronology interface, and the java.time.chrono.AbstractChronology class.

ThreeTen-Extra library adds more functionality to java.time. This includes providing several more Chronology implementations

其中之一是 AccountingCalendar. This implementation may suit your needs depending on how you define your fiscal calendar (which you neglected to document in your Question). This chronology is designed to follow the 52/53 week fiscal calendar rules as laid down in IRS Publication 538 and the International Financial Reporting Standards

由于这样的年表可以由每个公司使用日历来定义,所以我们需要 AccountingChronologyBuilder 来定义我们自己公司的定义。使用构建器,我们指定:

  • 结束星期几 - 给定会计年度结束的星期几。
  • 最后一个月与最近月底 - 结束星期几是当月的最后一天,还是最接近月底的(有时会在下个月。
  • 月末 - 年末 in/is 最接近的 Gregorian/ISO 月末。
  • 年份划分 - 将会计年度划分为多少 'months'(期间),每个期间有多少周。
  • 闰周月 - 哪个月将添加闰月 'week'。实际上,这可能是最后一个,但这似乎不是必需的。

构建器对象然后生成一个 AccountingChronology 供我们在我们的应用程序中使用。

我们可以从那里生成 AccountingDate objects. This class seems to have much functionality. Notice on this class the method until. To the starting date you provide an ending date, and you get back a java.time.chrono.ChronoPeriod 对象。从中你可能能够得到你的会计月数或会计周数。我不确定,因为我从未使用此会计年表做过任何工作。

仅供参考,似乎还有其他几个 classes 参与此会计年表实施:AccountingEra & AccountingYearDivision