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
, который, почему я и получил год.
Ссылки