Помогите с Java Calendar - он дает странный вывод - PullRequest
2 голосов
/ 03 октября 2009

Я новичок в Java и пытаюсь кое-что сделать с датами. Сначала я начал использовать класс Date, который, как я выяснил, в основном устарел, поэтому я переключился на Calendar.

Теперь я получаю странные значения. например, значение месяца для декабря равно 0, а не 12. А в тех календарях, где он дает мне 0 за декабрь, он также сдвигает год вперед на год.

Это странно!

Чего мне не хватает?

Спасибо за вашу помощь.

-GG

РЕДАКТИРОВАТЬ НА ПРИМЕРЕ:

Итак, я читаю некоторую строку sin из файла, такого как этот: Джонни Грэм H F 12-2-1973 черный

Я анализирую его, а затем для календаря, который я установил:

int year = Integer.parseInt(stringVersionOfYear); // this value is 1973

Потом, позже, когда я вернусь к году, с такой строкой:

calendar.get(Calendar.YEAR)

значение 1974 ... И месяц 0 для cal.get(Calendar.MONTH)

РЕДАКТИРОВАТЬ 2:

Я создаю Календарь следующим образом:

Calendar outputCalendar = Calendar.getInstance();
outputCalendar.set(year, month, day);

Ответы [ 4 ]

5 голосов
/ 03 октября 2009

Классы java.util.Date и Calendar плохо разработаны (например, первый день месяца - это день 1, а первый месяц в году - месяц 0). Многие проекты используют пакет Joda Time .

3 голосов
/ 03 октября 2009

значения месяцев от 0 до 11; установите месяц равным 12, и дата станет «нормализованной», увеличив год на единицу и установив месяц равным 0. Это позволяет легко «добавлять месяц», не беспокоясь об обработке переполнения в конце года.

РЕДАКТИРОВАТЬ: январь = 0, февраль = 1, ... декабрь = 11. Когда вы установили значение месяца равным 12, вы запрашивали 13-й месяц, который нормализовался до первого месяца следующего года.

Обратите внимание, что этот процесс нормализации происходит в целом - попробуйте установить дату на 32 декабря, и вы вернетесь 1 января следующего года. Это означает, что важно соблюдать осторожность при изменении отдельных полей объекта Calendar. Если вы создаете Календарь по умолчанию, скажем, 31 января, а затем хотите изменить его, чтобы он содержал, например, 5 февраля, порядок, в котором вы устанавливаете поля, важен. Если вы сначала измените месяц, то создадите 31 февраля, который нормализуется до 2 или 3 марта (в зависимости от високосного года), а затем, когда вы установите день 5, результатом будет 5 марта, а не 5 февраля. В других случаях у вас возникает противоположная проблема, например, начиная с любой даты февраля и переходя на 30-е или 31-е число любого другого месяца. В этом случае выполнение первого месяца приводит к тому же типу проблемы.

Единственный безопасный способ изменить дату - это использовать метод, который устанавливает все три значения одновременно, например метод set (int, int, int).

0 голосов
/ 03 октября 2009

Главный совет, который я могу вам дать: прочитайте API! Календарь действительно не является вершиной интуитивного дизайна API, но он определенно полезен, если вы потратите время на чтение Javadoc. Узнайте разницу между .add и .roll. Узнайте, что происходит, когда вы устанавливаете год (1973) в календарь, инициализированный текущей датой (по умолчанию Calendar.getInstance).

Хныкать об API все хорошо (мы все делаем это), но в конце концов, чтобы найти решения, начните с чтения того, что авторы предоставили вам, прежде чем задавать относительно тупые вопросы в Интернете.

0 голосов
/ 03 октября 2009

Видите эту строку?

outputCalendar.set(year, month, day);

Просто измените это так:

outputCalendar.set(year, month - 1, day);

и затем, когда вы хотите получить месяц, не используйте это:

cal.get(Calendar.MONTH)

вместо этого используйте это:

(1+(cal.get(Calendar.MONTH)))

Это боль, но решит проблему (я думаю).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...