2009-10-03 2 views
2

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

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

Странно!

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

Благодарим за помощь.

-GG

EDIT для примера:

Так я читаю некоторые строки грех из файла, такие как это: Джонни Грэм HF 12-2-1973 Black

я разобрать его , а затем для календаря я установил:

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

Тогда позже, когда я иду, чтобы получить год назад с линией, как это:

calendar.get(Calendar.YEAR) 

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

EDIT 2:

Я создаю календарь как это:

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

Если бы вы могли предоставить небольшой пример, это поможет понять, что вы делаете. – broschb

+0

Позвольте мне посмотреть, что я могу взломать :) –

ответ

3

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

EDIT: Январь = 0, февраль = 1, ... Декабрь = 11. Когда вы установите значение месяца на 12, вы просите 13-й месяц, который нормализовался до первого месяца следующего года.

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

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

+0

Почему это испортит год? –

+0

Человек, какой способ сделать Даты совершенно неинтуитивно! Все, что я делаю, это установить Календарь следующим образом: Calendar outputCalendar = Calendar.getInstance(); \t \t outputCalendar.set (год, месяц, день); Это неверный? –

+0

Ahhhhhhhhhhh Это последнее редактирование помогает Теперь я вижу ...! –

5

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

+0

Я бы сказал, что «плохо спроектированный» - это преуменьшение. :) –

0

Посмотрите на эту строку?

outputCalendar.set(year, month, day); 

Просто измените его следующим образом:

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

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

cal.get(Calendar.MONTH) 

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

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

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

+0

Нет, это не исправляет. То, что вам нужно сделать, это проверить, является ли месяц 12, а затем установите его на 0. Если я сделаю так, как вы говорите, это испортит каждый месяц, кроме декабря. (Я знаю, потому что я попробовал это;)) –

+0

Что я имел в виду выше, так это проверить, будет ли месяц, в который вы собираетесь ВХОД, 12. 12 делает переполнение месяца и года в следующем году. –

+0

Вы должны сделать * обе * вещи, которые я сказал. Вы видите, как я вычитал 1 при установке месяца «Календарь»? И как я добавил 1 при получении месяца? Поскольку плюс 1 отменяет минус 1, это даст вам именно то, что вы хотите. –

0

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

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

Смежные вопросы