gpt4 book ai didi

java - 应该如何使用 joda-time 表示 "first month of each quarteryear"?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:39:38 27 4
gpt4 key购买 nike

我正在研究一些会计逻辑。其逻辑是,发生在一个季度第一个月的会计必须有一个起息日在前一个季度的末尾。我知道我可以将月份表示为句点。但我不知道如何表示一个季度的周期。

我可以使用 joda-time 类进行计算,这些类会为我提供上一季度末的起息日。但是,我想将“每个季度的第一个月”表示为我在计算中使用的单个值。

那么joda-time中是否有一些API非常适合表示这种循环周期?

一些示例日期是:

date of invoce | value date  
2013-01-01 | 2012-12-31
2013-01-31 | 2012-12-31
2013-02-01 | 2013-02-01
2013-03-31 | 2013-03-31
2013-04-01 | 2013-03-31

好的,这里是评论中要求的更具解释性的示例:会计逻辑是关于你必须申请的一种养老基金。您在下一年申请2012年的养老金,恰好是2013年1月1日。将在2013年4月15日发放给您。由于4月是季度年的第一个月,发放将有起息日设置为3月31日。一个季度内入账的所有养老金将在该季度结束后的 1 个月零 5 天支付。因此,即使您在 4 月领取了养老金,您仍会在 5 月 5 日领取。否则,您必须等到 9 月 5 日才付款。

但我真的不知道这个例子应该有什么帮助。这个问题实际上是关于使用 joda-time 类对“每个季度的每个第一个月”进行建模,甚至是实现一些 joda-time API。

最佳答案

我也必须实现这个。这是一个乍一看似乎没问题的实现。

public class QuarterPeriods {

public static LocalDate quarterStartFor(LocalDate date) {
return date.withDayOfMonth(1).withMonthOfYear((((date.getMonthOfYear() - 1) / 3) * 3) + 1);
}

public static LocalDate quarterEndFor(LocalDate date) {
return quarterStartFor(date).plusMonths(3).minusDays(1);
}
}

public class QuarterPeriodsTest {

@Test
public void startOfQuarter() throws Exception {
assertThat(quarterStartFor(StubDates.dateOf("2011/02/02")), equalTo(StubDates.dateOf("2011/01/01")));
assertThat(quarterStartFor(StubDates.dateOf("2011/01/01")), equalTo(StubDates.dateOf("2011/01/01")));
assertThat(quarterStartFor(StubDates.dateOf("2011/02/02")), equalTo(StubDates.dateOf("2011/01/01")));
assertThat(quarterStartFor(StubDates.dateOf("2011/04/01")), equalTo(StubDates.dateOf("2011/04/01")));
assertThat(quarterStartFor(StubDates.dateOf("2011/07/01")), equalTo(StubDates.dateOf("2011/07/01")));
assertThat(quarterStartFor(StubDates.dateOf("2011/12/19")), equalTo(StubDates.dateOf("2011/10/01")));
}

@Test
public void endOfQuarter() throws Exception {
assertThat(quarterEndFor(StubDates.dateOf("2011/02/02")), equalTo(StubDates.dateOf("2011/03/31")));
assertThat(quarterEndFor(StubDates.dateOf("2011/01/01")), equalTo(StubDates.dateOf("2011/03/31")));
assertThat(quarterEndFor(StubDates.dateOf("2011/02/02")), equalTo(StubDates.dateOf("2011/03/31")));
assertThat(quarterEndFor(StubDates.dateOf("2011/04/01")), equalTo(StubDates.dateOf("2011/06/30")));
assertThat(quarterEndFor(StubDates.dateOf("2011/07/01")), equalTo(StubDates.dateOf("2011/09/30")));
assertThat(quarterEndFor(StubDates.dateOf("2011/12/19")), equalTo(StubDates.dateOf("2011/12/31")));
}
}

public class StubDates {

public static LocalDate dateOf(String date) {
return DateTimeFormat.forPattern("yyyy/MM/dd").withZone(DateTimeZone.UTC).parseDateTime(date).toLocalDate();
}
}

关于java - 应该如何使用 joda-time 表示 "first month of each quarteryear"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19923162/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com