为了计算德国年金贷款,我需要一个每月有30天的日历。每年有360天。没有闰年。
利息总是以30天为基础计算(这是德国的利息法)
我正在使用Java 8.我有什么可能使用新的java.time API来完成我的要求?
答案 0 :(得分:2)
您描述的是day count而非日历系统。日计数是将两个日期之间的时间段转换为年份分数的机制。
OpenGamma OG-Commons包括implementations of many day counts,包括30E / 360,这可能是您需要的方法。
答案 1 :(得分:1)
使用Java-8,原则上有两种实现任何日历的选项:
ChronoLocalDate
和Chronology
作为起点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来简化实现。