为什么 Calendar.getActualMaximum 不起作用

Sha*_*ung 2 java calendar

我想获得一个月的最大日期,它在某一天不起作用,就像代码一样,它按条件出现如下\nFebruary has Problem 2017 Feb Max is 28\xef\xbc \x8c如果您计算机的日期大于 28,例如 2017-03-29 或 2017-04-30

\n\n
Date date = PrimeUtil.formatStringToTime("2017-02","yyyy-MM");\nSystem.out.println(date);\nCalendar c = Calendar.getInstance();\nc.set(Calendar.YEAR,date.getYear());\nc.set(Calendar.MONTH,date.getMonth());\nc.set(Calendar.DAY_OF_MONTH,c.getActualMaximum(Calendar.DAY_OF_MONTH));\nSystem.out.println(c.getTime());\n
Run Code Online (Sandbox Code Playgroud)\n

Dan*_*tra 5

我遇到了你的问题。问题是,当您设置月份时,如果需要,日期会发生变化。

我有一个方法:

public static Date getLastDayOfMounth(int month){
    Calendar cTemp = Calendar.getInstance();
    // here is where I need to set the day
    cTemp.set(Calendar.MONTH, month);
    cTemp.set(Calendar.DAY_OF_MONTH, cTemp.getActualMaximum(Calendar.DAY_OF_MONTH));
    return cTemp.getTime();
}
Run Code Online (Sandbox Code Playgroud)

我有一个用于该方法的测试单元,用于测试每个月的方法,从 0 到 11。直到今天它一直有效。

今天,2018 年 3 月 29 日,2 月份的测试用例出错了……为什么?

第一个 cTemp = 29/03/2018(今天)

然后cTemp.set(Calendar.MONTH, 1);是 29/02/2018 但这一天不存在,所以变成了 01/03/2018

然后cTemp.getActualMaximum(Calendar.DAY_OF_MONTH)是三月的最后一天。

我解决了添加

cTemp.set(Calendar.DAY_OF_MONTH, 1);
Run Code Online (Sandbox Code Playgroud)

在设置月份之前。所以我总是从第一天开始,避免跳到下个月的问题。