如何创建每月30天的银行日历

时间:2015-02-02 12:31:04

标签: calendar java-8 java-time

为了计算德国年金贷款,我需要一个每月有30天的日历。每年有360天。没有闰年。

利息总是以30天为基础计算(这是德国的利息法)

我正在使用Java 8.我有什么可能使用新的java.time API来完成我的要求?

3 个答案:

答案 0 :(得分:2)

您描述的是day count而非日历系统。日计数是将两个日期之间的时间段转换为年份分数的机制。

OpenGamma OG-Commons包括implementations of many day counts,包括30E / 360,这可能是您需要的方法。

答案 1 :(得分:1)

使用Java-8,原则上有两种实现任何日历的选项:

  • 使用接口ChronoLocalDateChronology作为起点
  • 使用界面Temporal

我诚实地认为,在您的使用案例中,这两个选项都是禁止的。使用java.time.chrono包的第一个选项迫使您打扰时代,年代等等,这与360天日历完全无关。与仅从头开始实施日历相比,第二种选择过于抽象且简单,无法提供任何剩余价值。

第一个出发点是研究文献和互联网,例如极短Wikipedia。同样重要的是要认识并考虑到你的设计考虑因素,这种 360天 - “日历”不是严格意义上的日历,因为它没有定义从日历日期到朱利安日的独特和双射映射(几个相同的日期可能属于不同的实际日期! - 拒绝使用chrono-package的另一个重要原因。实际结果只是定义转换/工厂方法,如

Financial360DayCalendar f360 = Financial360DayCalendar.of(LocalDate date);

但不是相反的方向。除了映射/转换问题之外,计算两个这样的日期之间的持续时间是这个“日历”中的主要问题。如果你解决了两个方面,那么你的任务就完成了。除非您需要格式化,否则可能不需要更多内容。出于格式化目的,您可以考虑实现Java-8接口TemporalAccessor

一个(不完整的)想法:

class Financial360DayCalendar {
  private final int year;
  private final int month;
  private final int dayOfMonth;

  private Financial360DayCalendar(int year, int month, int dayOfMonth) {
    this.year = year;
    this.month = month;
    this.dayOfMonth = dayOfMonth;
  }

  public static Financial360DayCalendar of(LocalDate date) {
    int year = date.getYear();
    int month = date.getMonthValue();
    int dayOfMonth = date.getDayOfMonth();

    if (dayOfMonth == 31) {
      dayOfMonth = 30;
    }

    return new Financial360DayCalendar(year, month, dayOfMonth);
  }

  public int durationInDaysUntil(Financial360DayCalendar other) {
    // check also if other is not before this instance
    // ...
    // special algorithm (handling all intervening months as 30 days long)
    int interestDays = 30 - this.dayOfMonth(); // current day excluded
    int monthDelta = other.getMonthCount() - this.getMonthCount();
    if (monthDelta > 0) {
      monthDelta--;
    }
    interestDays += (30 * monthDelta + other.dayOfMonth);
    return interestDays;
  }

  public double getYearFraction(Financial360DayCalendar other) {
    return durationInDaysUntil(other) / 360.0;
  }

  private int getMonthCount() {
    return this.year * 12 + this.month;
  }
}

所以这是一种计算兴趣的方法,而不是真正的日历系统。您还可以参考this website (in German)查看有关如何计算持续时间的详细信息。

答案 2 :(得分:1)

您应该使用标准日历,不需要自定义日历。如果您需要根据30天月计算两个日期之间的天数,请使用以下方法:

GameObject

我使用JodaTime来简化实现。

相关问题