Сценарий с календарем на Java, в котором явная установка даты приводит к некоторому отличному результату

#java

#java

Вопрос:

Давайте посмотрим на следующий фрагмент кода на Java.

 package demo;

import java.util.Calendar;

final public class Main
{
    public static void main(String[] args)
    {
        Calendar cal = Calendar.getInstance();
        cal.set(2011, 11, 11);   //Setting a date to itself.

        System.out.println(cal.get(Calendar.YEAR)   " " 

          cal.get(Calendar.WEEK_OF_YEAR)   " 

       "   cal.get(Calendar.DAY_OF_YEAR));
    }
}
  

В приведенном выше простом коде я временно (и явно) устанавливаю текущую дату самой по себе, которая равна 2011-11-11, используя метод cal.set(2011, 11, 11); . Соответственно, я получаю выходные данные 2011 51 345, текущего 2011 года, 51 недели в году и 345 дня в году.


Когда я оставляю комментарий к этой строке, которая является cal.set(2011, 11, 11); , я получаю результат, 2011 46 315 текущий год, текущую неделю года и текущий день года соответственно, который отличается от предыдущего результата.

[Здесь я не устанавливаю никакой даты. Оператор cal.set(2011, 11, 11); в приведенном выше коде закомментирован, и система автоматически извлекает текущую дату, которая является 2011-11-11].


В обоих случаях используется одна и та же дата, которая является 2011-11-11, но полученный результат отличается в обоих случаях. Почему?

Ответ №1:

Значение месяца основано на 0. Если вы имели в виду ноябрь, используйте:

 cal.set(2011, 10, 11);
  

Смотрите javadocs Calendar.

Ответ №2:

Месяц в Java индексируется как ноль. Вы устанавливаете его на 11 декабря, когда выбираете 11 месяц.