Неожиданное поведение с классом календаря Java - PullRequest
1 голос
/ 10 ноября 2011

У меня есть следующий код для получения различных частей текущей системы. Дата (для этого случая 10-11-2011).

Calendar now = Calendar.getInstance();
String dt = ""+now.get(now.DATE)+"-"+now.get(now.MONTH)+"-"+now.get(now.YEAR);

Здесь поля DATE и YEAR дают значения, как и ожидалосьно поле MONTH дает неожиданные результаты, во-первых, я не знал, что поле MONTH начинается с нуля, поэтому текущий месяц как 11 даст мне 10.Теперь, если я использую now.get(now.MONTH+1), тогда возвращается 46.И использование просто now.MONTH вместо использования get метода дает 2.

Итак, что я здесь не так делаю?это не должно быть ошибкой в ​​классе Calendar.

Обратите внимание, что я использую JDK 7.

Ответы [ 2 ]

5 голосов
/ 10 ноября 2011

Вам нужно now.get(Calendar.MONTH) + 1.

now.get(Calendar.MONTH) возвращает месяц, начиная с 0. И вам нужно добавить 1 к результату. Если вы делаете now.get(Calendar.MONTH + 1), вы получаете что-то отличное от месяца, потому что вы больше не передаете постоянную MONTH методу get. get просто принимает int в качестве параметра. Постоянный МЕСЯЦ означает «я хочу получить месяц». Постоянная ДАТА означает «Я хочу получить дату». Их значение не имеет смысла. МЕСЯЦ - 2, а 3 - WEEK_OF_YEAR.

Также обратите внимание, что статические переменные (или константы) должны быть доступны с использованием имени класса, а не экземпляра класса.

Рассматривали ли вы использовать SimpleDateFormat? Этот класс используется для форматирования даты с использованием определенного шаблона:

new SimpleDateFormat("dd/MM/yyyy").format(now.getTime());
0 голосов
/ 10 ноября 2011

Месяц с нулевым индексом согласно Javadoc :

Месяц представлен целым числом от 0 до 11; 0 - январь, 1 - февраль и т. Д .; таким образом, 11 - декабрь.

и аналогично для Calendar

Первый месяц года в григорианском и юлианском календарях - ЯНВАРЬ, равный 0; последнее зависит от количества месяцев в году.

Вам нужно добавить 1 к нему, чтобы отобразить его численно или использовать java.text.SimpleDateFormat, который сделает это автоматически для вас.

Если вы много работаете с датами, тогда я предлагаю использовать Joda time . Это намного лучше, чем обработка даты / времени в базовой библиотеке Java.

Joda-Time обеспечивает качественную замену для классов даты и времени Java. Конструкция позволяет использовать несколько календарных систем, но при этом предоставляет простой API. Календарь по умолчанию - это стандарт ISO8601, который используется XML. Также включены григорианская, юлианская, буддистская, коптская, эфиопская и исламская системы, и мы приветствуем дальнейшие дополнения. Вспомогательные классы включают часовой пояс, продолжительность, формат и разбор.

...