日历麻烦 - 无法获得正确的日子

时间:2013-12-02 10:11:30

标签: java calendar

我在循环中有这个代码:

        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?我很确定我错过了一些非常小的东西,但我无法发现它。

3 个答案:

答案 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天......