dayOfMonth(31) in Month.AUGUST



下面的代码计算孩子从幼儿园毕业的确切日期。总是在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,但是把它赋值给了austrittwithMonthOfYear返回一个修改后的副本,它不修改调用它的元素。考虑以下内容:

austritt = sechs.withYea(...)
                .withMonthOfYear(...)
                .withDayOfMonth(...);
每个API

返回该日期的副本,并更新日期字段。

DateMidnight是不可变的,所以没有set方法。相反,该方法返回一个新实例,其中更改了月中的日期。

问题是with*()返回一个新的日期实例。

您需要执行sechs = sechs.with*()或使用构造函数。

最新更新