下面的代码计算孩子从幼儿园毕业的确切日期。总是在6岁生日之后的8月31日。Dob是孩子的生日:
public static DateMidnight getKigaAustritt(DateMidnight dob){
DateMidnight sechs = dob.plus(Period.years(6));
DateMidnight austritt = new DateMidnight(sechs);
if (sechs.getMonthOfYear() > Month.AUGUST){
austritt = sechs.withYear(sechs.getYear()+1);
austritt = sechs.withMonthOfYear(Month.AUGUST);
austritt = sechs.withDayOfMonth(31);
}else{
austritt = sechs.withMonthOfYear(Month.AUGUST);
austritt = sechs.withDayOfMonth(31);
}
return austritt;
}
现在,如果我把它留在那里,方法从其他地方调用,我总是得到一个错误,指出dayOfMonth()必须在[1,30]范围内。如果我将代码更改为..withDayOfMonth(30),程序工作正常,但提前一天使孩子毕业。现在是八月,我想知道为什么会发生这种情况。有提示吗?
问题是没有设置'sechs'的月份。这是因为你调用了sechs.withMonthOfYear
,但是把它赋值给了austritt
。withMonthOfYear
返回一个修改后的副本,它不修改调用它的元素。考虑以下内容:
austritt = sechs.withYea(...)
.withMonthOfYear(...)
.withDayOfMonth(...);
每个API 返回该日期的副本,并更新日期字段。
DateMidnight是不可变的,所以没有set方法。相反,该方法返回一个新实例,其中更改了月中的日期。
问题是with*()
返回一个新的日期实例。
您需要执行sechs = sechs.with*()
或使用构造函数。