GegorianCalendar дает мне 2018 для int month = calendar.get (Calendar.FEBUARY) - PullRequest
0 голосов
/ 20 мая 2018

Так что я работаю над программой календаря и меняю месяцы, спрашивая целое число месяца.

Если я наберу calendar.get (Calendar.JANUARY), я получу 1 в качестве возврата, что правильнопотому что первый месяц.Но если я наберу calendar.get (Calendar.FEBUARY), я получу 2018 в ответ, что, конечно, неправильно.Кто-нибудь знает, в чем может быть проблема?

Calendar cal1 = new GregorianCalendar();
int month = cal1.get(Calendar.JANUARY);
int month2 = cal1.get(Calendar.FEBRUARY);
int year = cal1.get(Calendar.YEAR);

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

java.time

TJ Crowder ответ правильный.Позвольте мне предоставить реальное, хорошее и современное решение вашей проблемы.

    ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Atlantic/Stanley"));
    // 2018-05-21T05:02:23.942763-03:00[Atlantic/Stanley]
    Month monthEnum = zdt.getMonth(); // MAY
    int monthNumber = zdt.getMonthValue(); // 5
    int year = zdt.getYear(); // 2018

Я только что выполнил код и дал результаты в комментариях после каждой строки кода.Пожалуйста, укажите желаемый часовой пояс, в который я поместил Atlantic / Stanley, поскольку месяц не меняется в один и тот же момент времени в разных часовых поясах.Согласны ли вы со мной, что этот код яснее и естественнее и оставляет меньше места для путаницы?Кстати, если вас интересует только дата, а не время суток, используйте LocalDate вместо ZonedDateTime, остальной код будет таким же.

Чтобы получить номера определенныхмесяцы:

    int januaryNumber = Month.JANUARY.getValue(); // 1
    int februaryNumber = Month.FEBRUARY.getValue(); // 2

Что произошло в вашем коде?

Как уже сказал TJ Crowder, Calendar.get ожидает номер поля , например Calendar.MONTH илиCalendar.YEAR.Calendar.JANUARY равно 0. Ноль ?!Еще одна запутанная вещь о Calendar, номера месяцев начинаются с 0, то есть они идут от 0 для января до 11 для декабря.В любом случае, 0 также является номером поля Calendar.ERA.GregorianCalendar использует 0 для нашей эры (или более нейтральной к религии: до нашей эры до нашей эры) и 1 для нашей эры (CE, обычной эры).Поскольку ваша дата относится к обычной эре, вы получаете 1. Что, кстати, было бы неверно для января месяца, поскольку месяцы основаны на 0.

Аналогично, Calendar.FEBRUARY равно 1 и совпадает сномер поля Calendar.YEAR, который, почему я и получил год.

Ссылки

0 голосов
/ 20 мая 2018

Calendar#get получает значение поля .Calendar.JANUARY - это не номер поля, это потенциальное поле значение .Единственные статические поля в Calendar, которые вы используете с getset), - это те, чьи описания начинаются с "Номер поля для get и set ...".

Чтобы получить месяц, используйте cal1.get(Calendar.MONTH).

API Calendar ... неудачный, не в последнюю очередь потому, что он предшествует перечислениям, и поэтому int использовался для get / set.параметр идентификатора поля, где действительно нужно перечисление.Хотя get занимает int, а Calendar.JANUARY - int, они int в разных доменах.См. Ole VV's answer для современной, значительно улучшенной альтернативы: java.time.

...