我在循环中有这个代码:
Calendar cal = Calendar.getInstance();
cal.setTime(row.getCell(0).getDateCellValue());
ProdCalendar currentCal = DefaultProdCalendar.get();
int workingDaysBefore = 0;
int workingDaysAfter = 0;
Calendar start = Calendar.getInstance();
Calendar end = Calendar.getInstance();
end.setTime(row.getCell(0).getDateCellValue());
start.add(Calendar.MONTH,-1);
// DAYS OF PREV MONTH
int pDate = end.get(Calendar.DAY_OF_MONTH);
int allDaysThisMonth = end.getActualMaximum(Calendar.DAY_OF_MONTH);
int allDaysPrevMonth = start.getActualMaximum(Calendar.DAY_OF_MONTH);
其中row.getCell(0).getDateCellValue()
是以这种格式形成xls
文件的日期:15/08/13
我面临的问题是这一行:
int allDaysPrevMonth = start.getActualMaximum(Calendar.DAY_OF_MONTH);
总是返回30
为什么start
日历总是返回30?我很确定我错过了一些非常小的东西,但我无法发现它。
答案 0 :(得分:2)
您可能希望将start
的时间设置为start.setTime(row.getCell(0).getDateCellValue());
,然后使用start.add(Calendar.MONTH,-1);
设置1个月后的时间。
否则,您将获取截至今天的当月(即decembre)并获取上个月。 Novembre有30天,所以getActualMaximum
返回30
你所做的是你设置一个明确的结束日期,而不是相应的开始日期。这会导致您的开始日期在结束日期之后,这肯定不是您想要的效果。
答案 1 :(得分:1)
如果你看一下Calendar#getActualMaximum(field)
的文档,
给定此Calendar的时间值,返回指定日历字段可能具有的最大值。例如,MONTH字段的实际最大值在某些年份为12,在希伯来日历系统中为其他年份的13。
在您的情况下,您已获得DAY_OF_MONTH
,该字段会返回DAY_OF_MONTH
字段在给定月份内可以拥有的最大值。
例如,
Calendar start = Calendar.getInstance(); // Be default, its today, December
System.out.println(start.getActualMaximum(Calendar.DAY_OF_MONTH)); // prints 31, as December as 31 days
你改变月份,然后
Calendar start = Calendar.getInstance(); // Be default, its today, dec.
start.set(Calendar.MONTH, 10); // Month is set to November
System.out.println(start.getActualMaximum(Calendar.DAY_OF_MONTH)); // prints 30, as November as 30 days
您总是得到30,因为当前月份是 12月,当您执行start.add(Calendar.MONTH,-1);
时,它会将当前月份设置为 11月,并且如上所述,自11月有30天,你总是得到30天。
答案 2 :(得分:1)
日历开始= Calendar.getInstance();
在这里,你得到的开始是当月 - 十二月。 然后,你注意到它,但回到一个月,在这里:start.add(Calendar.MONTH,-1); 最后,你得到了“开始”的实际最大值... ...,11月最多有30天......