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

Posted

技术标签:

【中文标题】如何计算定义自定义财务日历的两个日期之间的月数?【英文标题】:How to calculate number of months in between 2 dates having custom financial calendar defined? 【发布时间】:2019-12-30 17:03:31 【问题描述】:

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

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

在上表中你可以看到fiscalmonthP1指的是日期20190125。(可能fiscalmonth-P1是从20190115开始到20190215

此表在数据库中。我正在研究 java 部分以创建功能,该功能将根据提供的两个会计日期(将参考上表的 yyyymmdd 列)返回 Periodbetween 对象以发挥作用。

public class PeriodBetween 

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

这个periodBetween 对象提供了有关这两个日期之间的天数/周数/月数/季度数的更多信息。 public PeriodBetween between(int startDate, int endDate)

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

如果这样的东西已经存在或者除了使用Financial Calendar 表之外还有其他方法,请告诉我。

更新: 有时日历是 28 天或 35 天的场景取决于客户遵循哪个日历。因此,根据客户端,Financial Calendar Table 将被填充。

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

我现在如何定义我的日历? 从客户那里获得他们希望如何定义日历的要求。使用它我正在填充上面提到的表格并在任何地方使用该表格。 所以让我们在财务日历上说我想找出3rd day of P3 month on Financial year 2018 是什么。 然后我对该表的查询将是提取这一天的更多信息:select * from financial_calendar where fiscaldayofmonth=3 and fiscalmonth=P3 and fiscalyear=Financial Year 2018

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

【问题讨论】:

我不知道你在问什么,但Period.between() 本身使用LocalDate.until(),并且它没有native 方法,所以一切都在该文件中。为了计算月差,它有效地计算两个日期的packedDate=(Y*12+M-1)*32+D,并为您提供(packedDate2-packedDate1)/32(整数除法)。 我已经自定义了在 DB 中的 Financial Calendar Table 中定义的财务日历。因此,我必须使用参考表来计算两个yyyymmdd 之间的月数。 应该提供一些具体的例子,预计什么日期会产生什么结果。我可以理解2835 是可取的,因为它们是7 的倍数,但是“有时这个有时那个”并不是一个很明确的定义。 您的会计日历是可预测的还是任意的? 我想知道,对于财务日历,是否可以实现 java.time 框架中使用的Chronology 接口。然后,您可以使用其余的 java.time 类,而无需重新发明***。 Java 附带 AbstractChronology 和五个实现(Hijrah、ISO 8601、日语、民国和 ThaiBuddhist。ThreeTen-Extra 库提供了另外九个,包括 AccountingChronology 每 IRS 出版物 538 和国际财务报告标准。 【参考方案1】:

AccountingChronology

Java 8 及更高版本中的 java.time 框架默认使用基于ISO 8601 的年表。然而,这个年表是pluggable。

捆绑了其他四个年表实现:Hijrah、Japanese、Minguo 和 ThaiBuddhist。这些是java.time.chrono.Chronology 接口和java.time.chrono.AbstractChronology 类的基础。

ThreeTen-Extra 库为 java.time 添加了更多功能。这包括提供several more Chronology implementations。

其中之一是AccountingCalendar。此实施可能适合您的需求,具体取决于您如何定义会计日历(您忽略了在您的问题中记录)。此年表旨在遵循 IRS Publication 538International Financial Reporting Standards 中规定的 52/53 周财政日历规则。

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

ending day-of-week - 给定会计年度结束的星期几。 last-in-month vs. nearest-end-of-month - 结束星期几是本月的最后一天,还是最接近月底的日期(有时会在下个月. 月末 - 一年的结束/最接近哪个公历/ISO 月末。 年划分 - 将会计年度划分为多少个“月”(期间),以及每个月有多少周。 闰周月 - 哪个月将添加闰“周”。实际上,这可能是最后一个,但这似乎不是必需的。

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

从那里我们可以产生AccountingDate 对象。这个类似乎有很多功能。注意这个类的方法until。到开始日期,您提供结束日期,然后您会返回一个 java.time.chrono.ChronoPeriod 对象。从中您可能能够获得会计月或会计周的计数。我不确定,因为我从未使用此会计年表做过任何工作。

仅供参考,这个会计年表实现似乎还涉及其他几个类:AccountingEraAccountingYearDivision

【讨论】:

我已更新我的问题以添加更多信息。为没有添加额外信息而道歉。我将查看提供的库和文档,看看它是否符合我的要求。

以上是关于如何计算定义自定义财务日历的两个日期之间的月数?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算两个日期之间的月数和天数,而不在 SQL Server 中返回负值

计算两个日期之间的月数

计算SQL中两个日期之间的月数[重复]

两个日期之间的月数

r 中每年两个日期之间的月数

查询两个日期相差的月数和剩下的天数