首页 > 解决方案 > 如何计算定义自定义财务日历的两个日期之间的月数?

问题描述

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

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

在上表中,您可以看到它fiscalmonth P1指的是日期 20190125。(可能fiscalmonth-P1是从2019011520190215

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

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)

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

让我知道这样的东西是否已经存在,或者除了使用Financial Calendar表之外还有其他方法。

更新:有时日历 cab 为 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

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

标签: javajava-8java-timefiscal

解决方案


AccountingChronology

Java 8 及更高版本中的java.time框架默认使用基于ISO 8601的年表。但是,该年表是可插入的。

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

ThreeTen -Extra库为java.time添加了更多功能。这包括提供更多的Chronology实现

其中之一是AccountingCalendar。此实施可能适合您的需求,具体取决于您如何定义财务日历(您忽略了在您的问题中记录)。该年表旨在遵循美国国税局第 538 号出版物国际财务报告准则中规定的 52/53 周财政日历规则。

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

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

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

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

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


推荐阅读