如何计算定义自定义财务日历的两个日期之间的月数?
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开始)
为了引用哪个日历日期指哪个财务日期,我定义了一个具有以下列结构的表:
在上表中你可以看到fiscalmonth
P1
指的是日期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
之间的月数。
应该提供一些具体的例子,预计什么日期会产生什么结果。我可以理解28
和35
是可取的,因为它们是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 538 和 International Financial Reporting Standards 中规定的 52/53 周财政日历规则。
由于每个公司都可以使用日历来定义这样的年表,因此我们需要 AccountingChronologyBuilder
来定义我们自己公司的定义。使用构建器,我们指定:
builder 对象然后生成一个AccountingChronology
供我们在我们的应用程序中使用。
从那里我们可以产生AccountingDate
对象。这个类似乎有很多功能。注意这个类的方法until
。到开始日期,您提供结束日期,然后您会返回一个 java.time.chrono.ChronoPeriod
对象。从中您可能能够获得会计月或会计周的计数。我不确定,因为我从未使用此会计年表做过任何工作。
仅供参考,这个会计年表实现似乎还涉及其他几个类:AccountingEra
和AccountingYearDivision
。
【讨论】:
我已更新我的问题以添加更多信息。为没有添加额外信息而道歉。我将查看提供的库和文档,看看它是否符合我的要求。以上是关于如何计算定义自定义财务日历的两个日期之间的月数?的主要内容,如果未能解决你的问题,请参考以下文章