下面的代码计算孩子从Kindergarden毕业的确切日期。通常是6岁生日后的8月31日。道布是孩子的生日:
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),程序可以正常工作,但是提前一天让孩子毕业。现在,MonthOfYear已经是八月了,我想知道为什么会发生这样的事情。有什么提示吗?
发布于 2011-11-03 22:11:45
问题是没有设置“sechs”的月份。这是因为您正在调用sechs.withMonthOfYear,但将其分配给了austritt。withMonthOfYear返回一个修改过的副本,它不会修改调用它的元素。请考虑以下几点:
austritt = sechs.withYea(...)
.withMonthOfYear(...)
.withDayOfMonth(...);每个API
返回此日期的副本,其中的日期字段已更新。
DateMidnight是不可变的,所以没有设置方法。相反,此方法返回一个值已更改的新实例。
发布于 2011-11-03 22:14:26
问题是with*()返回一个新的date实例。
您需要执行sechs = sechs.with*()或使用构造函数。
然后返回sechs。
https://stackoverflow.com/questions/7996221
复制相似问题