【问题标题】:Days 30/360 calendar calculator implementation [closed]天 30/360 日历计算器实施 [关闭]
【发布时间】:2020-02-10 22:49:43
【问题描述】:

我需要使用 30/360 天日历实施来进行财务计算。 基本上,财务术语中的 30/360 意味着所有月份都将被视为 30 天。

对于我的场景,我有一个开始日期和一个结束日期,我需要在 30/360 日历中计算它们之间的差异。

是否有用于此实现的现有 java 库?

有一个 Apache POI 类 Days360,但它奇怪地将参数作为日期参数的 double 类型。

【问题讨论】:

标签: java date apache-poi finance


【解决方案1】:

是否有用于此实现的现有 java 库?

这个问题与 Stack Overflow 无关。我不知道答案。所以我赶紧假装你问了一个编程问题。为您的计算编写一个方法并不难。

public static long daysBetween(LocalDate from, LocalDate to) {
    if (to.isBefore(from)) {
        throw new IllegalArgumentException();
    }
    if (from.getDayOfMonth() == 31) {
        from = from.withDayOfMonth(30);
    }
    if (to.getDayOfMonth() == 31) {
        to = to.withDayOfMonth(30);
    }

    long months = ChronoUnit.MONTHS.between(
            YearMonth.from(from), YearMonth.from(to));
    int daysSigned = to.getDayOfMonth() - from.getDayOfMonth();

    return 30 * months + daysSigned;
}

我想向您展示其计算结果的几个示例。为此,我使用以下方法:

public static void tryItOut(LocalDate from, LocalDate to) {
    long result = daysBetween(from, to);
    System.out.format("%s - %s: %3d day/s%n", from, to , result);
}

然后这样称呼它:

    tryItOut(LocalDate.of(2020, Month.FEBRUARY, 1), LocalDate.of(2020, Month.FEBRUARY, 20));
    tryItOut(LocalDate.of(2020, Month.FEBRUARY, 1), LocalDate.of(2021, Month.FEBRUARY, 1));
    tryItOut(LocalDate.of(2021, Month.FEBRUARY, 1), LocalDate.of(2021, Month.MARCH, 13));
    tryItOut(LocalDate.of(2020, Month.JANUARY, 30), LocalDate.of(2020, Month.FEBRUARY, 1));
    tryItOut(LocalDate.of(2020, Month.JANUARY, 31), LocalDate.of(2020, Month.FEBRUARY, 1));
    tryItOut(LocalDate.of(2020, Month.JANUARY, 25), LocalDate.of(2020, Month.MARCH, 31));
    tryItOut(LocalDate.of(2020, Month.MARCH, 30), LocalDate.of(2020, Month.MARCH, 31));
    tryItOut(LocalDate.of(2020, Month.FEBRUARY, 29), LocalDate.of(2020, Month.MARCH, 1));

输出是:

2020-02-01 - 2020-02-20:  19 day/s
2020-02-01 - 2021-02-01: 360 day/s
2021-02-01 - 2021-03-13:  42 day/s
2020-01-30 - 2020-02-01:   1 day/s
2020-01-31 - 2020-02-01:   1 day/s
2020-01-25 - 2020-03-31:  65 day/s
2020-03-30 - 2020-03-31:   0 day/s
2020-02-29 - 2020-03-01:   2 day/s

为了将double 值传递给Apache POI,编写一个将LocalDate 转换为double 的方法可能并不难。但是那个库是用来访问 Excel 电子表格的,所以如果这不是您的需要,我想我不会打扰(Excel 可能是 Microsoft 的 TM)。

链接: Oracle tutorial: Date Time 解释如何使用 java.time。

【讨论】:

  • 我已经写过类似的方法了。但是,如果您正确阅读了我的问题,您会看到我要求的是现有实现。原因是 30/360 日历及其变化在金融界非常普遍。因此,我希望有一个久经考验的实现。所以让我假装你发布了一个有效的答案。还是谢谢。
  • @Navs 我故意以不同的方式阅读您的问题,我也在答案中说明了这一点。我原以为我会那样帮你一个忙,很抱歉我错了。现在,其他人已经认真对待您的问题,并将其关闭为题外话。 要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题与 Stack Overflow 无关,因为它们往往会吸引固执己见的答案和垃圾邮件。来自What topics can I ask about here?
猜你喜欢
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多