2012-07-29 7 views
2

Я только что попробовал метод java.util.Calendar getActualMaximum(), чтобы узнать, могу ли я получить максимальное количество дней в месяц с учетом года. Вот мой код:В java.util.Calendar, почему установка значения Calendar.YEAR влияет на значение Calendar.MONTH?

public static void main(String[] args) { 
    Calendar c = Calendar.getInstance(); // today is July 29, 2012 
    System.out.println(c.get(Calendar.MONTH) + " " + c.getActualMaximum(Calendar.DATE) + " " + c.get(Calendar.YEAR)); 
    c.set(Calendar.MONTH, Calendar.FEBRUARY); // set to February 2012 
    System.out.println(c.get(Calendar.MONTH) + " " + c.getActualMaximum(Calendar.DATE) + " " + c.get(Calendar.YEAR)); 
    c.set(Calendar.YEAR, 2011); // set year to 2011, now February 2011 
    System.out.println(c.get(Calendar.MONTH) + " " + c.getActualMaximum(Calendar.DATE) + " " + c.get(Calendar.YEAR)); 
} 

Выход Я ожидаю, что это:

6 31 2012 // last day of July 2012 is 31 
1 29 2012 // last day of Feb 2012 is 29 
1 28 2011 // last day of Feb 2011 is 28 

Однако, это то, что я получаю:

6 31 2012 
1 29 2012 
2 31 2011 // HUH? 

(В java.util.Calendar , значения месяца начинаются от 0 до 11 за период с января по декабрь, а дни самих месяцев начинаются с 1.)

Почему mon th вдруг установлен на Calendar.MARCH? Что здесь происходит, и что я могу сделать, чтобы получить последние дни данного месяца и года правильно? Я изучаю метод, потому что я не хочу настраивать свой собственный массив логических значений, где это верно для индексов, которые представляют 31-дневные месяцы, а false для нет.

ответ

2

Я считаю, что календарь вспомнить, сколько дней в году вы. в 2012 году вы были на 31-й день + 29 = 29 февраля. В 2011 году это было 1 марта. Затем вы попросили фактический максимум этого месяца, который (на март) равен 31.

Calendar API ужасен.

Вы должны просто установить год и месяц непосредственно перед тем, как задать фактический максимум в вашем прецеденте.

+0

Только один из многих классов, которые расстраивают меня при использовании Java. –

+0

Я все равно создал булевский массив. Это гораздо надежнее, чем придумать обходные пути для недостатков API Календаря. –

0

Это происходит потому, что один год до 29 февраля 2012 1 марта 2011 года

0

В феврале 2011 года не существует 29-го дня, когда эта функция автоматически настраивается на первую действительную дату. Он полагает, что вы уплываете в первый день после 28 февраля, который является 1 марта.

Смежные вопросы