Использование класса календаря в Java

1

Я сделал простой тест в классе Calendar. Код:

public static void main(String[] args) {

        TimeZone tz = TimeZone.getTimeZone("Asia/Kathmandu");
        System.out.println(tz.getDisplayName());

        Calendar cal1 = Calendar.getInstance();
        cal1.set(2014, 8, 31);

        System.out.println(cal1.getTimeZone().getDisplayName());
        Calendar cal2 = Calendar.getInstance();
        cal2.set(2014,9,1);

        int diff = cal2.get(Calendar.MONTH)-cal1.get(Calendar.MONTH);
        System.out.println(diff);
        System.out.println(cal2.get(Calendar.MONTH));
        System.out.println(cal1.get(Calendar.MONTH));

    }

В результате получилось:

Nepal Time
Nepal Time
0
9
9

Почему я получаю MONTH как "9" для cal1 вместо "8"?

  • 1
    Подумайте об использовании нового API java.time если можете. Там гораздо меньше сюрпризов.
  • 1
    Возможный дубликат Почему январь месяц 0 в календаре Java?
Показать ещё 1 комментарий
Теги:

5 ответов

3

Поскольку нумерация месяца начинается с 0, так что 8 й месяц - September, у которого 30 дней.

Но вы назначили день 31. Дополнительный 1 день добавляется к следующему месяцу October, номер месяца 9. Так как cal1 и cal2 имеет месяц - October.

Вот почему в обоих случаях он показывает 9.

2

В календаре массив месяцев начинается с нуля, поэтому январь равен 0. Вводя в 8/31, система думает, что вы говорите 31 сентября, что будет 9-м месяцем, поэтому 8-й в массиве. 31 сентября не существует, поэтому система ударяет месяц до октября, поэтому 9-й в массиве.

Я бы предложил использовать константы календаря вместо чисел за месяцы.

Calendar.AUGUST
Calendar.SEPTEMBER
  • 0
    Если я установлю на 8/30, то он отображает правильный месяц.
  • 0
    Да, вернется 8, но вы не нашли причину проблемы. Установка даты как (2014, 8, 30) не устанавливает ее на 30 августа, она устанавливает 30 сентября.
2

Если вы посмотрите внутри исходного кода (находящегося в src.zip в вашей папке JDK) класса java.util.Calendar вы увидите следующий код:

 /**
     * Value of the {@link #MONTH} field indicating the
     * first month of the year in the Gregorian and Julian calendars.
     */
    public final static int JANUARY = 0;

    /**
     * Value of the {@link #MONTH} field indicating the
     * second month of the year in the Gregorian and Julian calendars.
     */
    public final static int FEBRUARY = 1;

    /**
     * Value of the {@link #MONTH} field indicating the
     * third month of the year in the Gregorian and Julian calendars.
     */
    public final static int MARCH = 2;

    /**
     * Value of the {@link #MONTH} field indicating the
     * fourth month of the year in the Gregorian and Julian calendars.
     */
    public final static int APRIL = 3;

    /**
     * Value of the {@link #MONTH} field indicating the
     * fifth month of the year in the Gregorian and Julian calendars.
     */
    public final static int MAY = 4;

    /**
     * Value of the {@link #MONTH} field indicating the
     * sixth month of the year in the Gregorian and Julian calendars.
     */
    public final static int JUNE = 5;

    /**
     * Value of the {@link #MONTH} field indicating the
     * seventh month of the year in the Gregorian and Julian calendars.
     */
    public final static int JULY = 6;

    /**
     * Value of the {@link #MONTH} field indicating the
     * eighth month of the year in the Gregorian and Julian calendars.
     */
    public final static int AUGUST = 7;

    /**
     * Value of the {@link #MONTH} field indicating the
     * ninth month of the year in the Gregorian and Julian calendars.
     */
    public final static int SEPTEMBER = 8;

    /**
     * Value of the {@link #MONTH} field indicating the
     * tenth month of the year in the Gregorian and Julian calendars.
     */
    public final static int OCTOBER = 9;

    /**
     * Value of the {@link #MONTH} field indicating the
     * eleventh month of the year in the Gregorian and Julian calendars.
     */
    public final static int NOVEMBER = 10;

    /**
     * Value of the {@link #MONTH} field indicating the
     * twelfth month of the year in the Gregorian and Julian calendars.
     */
    public final static int DECEMBER = 11;
1

Почему я получаю MONTH как "9" для cal1 вместо "8"?

Потому что месяцы начинаются с 0.

0 for January
1 for February
...
11 for December

Я рекомендую использовать поля константы Calendar в течение нескольких месяцев, например Calendar.JANUARY, Calendar.FEBRUARY... Calendar.DECEMBER чтобы избежать путаницы.

  • 2
    Даже если месяцы начинаются с 0, я явно устанавливаю значение «8». И отображал «9» для месяца, установленного на «9». Почему не «10»?
  • 0
    Вместо того, чтобы выдавать исключение для недопустимой даты (31 сентября - с нулевым индексом 08-31), он «исправляет» это и делает его 1 октября (09-01). Таким образом, оба экземпляра настроены на один и тот же день. Таким образом, фактическое значение 08-31 меняется на 09-01, это не просто отображение.
0

Это потому, что cal1.set(2014, 8, 31); инициировать календарь с 31-м днем сентября (на основе нуля). потому что сентябрь имеет только 30 дней, это будет первый октябрь, и именно поэтому вы получаете 9 в месяц, что такое октябрь в индексе с нулевым индексом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню