2011-01-04 1 views
1

У меня проблемы с календарем Java. Я разбираю некоторые данные из txt-файла и мне нужно создать дату. После завершения следующего кода:Настройка календаря Java Неправильно

tmpYear = Double.parseDouble(row[yearIndex]); 
tmpMonth = Double.parseDouble(row[monthIndex]); 
tmpDay = Double.parseDouble(row[dayIndex]); 
if(timeIndex != -1) 
    tmpTime = Double.parseDouble(row[timeIndex]); 
if(secondsIndex != -1) 
    tmpSeconds = Double.parseDouble(row[secondsIndex]); 

Я могу отлаживать и видеть, что переменные являются следующие: tmpYear == 2010
tmpMonth == 12
tmpDay == 30
tmpTime == 15 (Это час дня)
tmpSeconds == 0

Но при выполнении следующего кода:

cal.set((int)tmpYear,(int)tmpMonth,(int)tmpDay,(int)tmpTime, 
      (int)((tmpTime - (int)tmpTime)*100),(int)tmpSeconds); 
System.out.println(cal.getTime().toString()); 

Я получаю это для вывода:
вс 30 января 15:00:00 CST 2011

Может кто-то объяснить, что возможная причина для этого будет? Спасибо всем за помощь!

+2

Почему вы анализируете значения как парные? Вы действительно * ожидаете значения «12,5» за день месяца и т. Д.? –

+0

Ни один «Использовать JodaTime» не отвечает? Псих. – ILMTitan

ответ

5

месяцев индексируются 0-11 вместо 1-12.
0 = январь
1 = февраль
...
11 = декабрь
Использование tmpMonth = value -1 вместо этого.

2

Я считаю, что ценность месяца начинается в 0, а не 1, так что снова интерпретирует 0, как Ян, 1 февраля, как ..., а затем, как Jan 12

+0

12-й месяц в календаре Java - Undecimber; http://en.wikipedia.org/wiki/Undecimber – Esko

2

Из API:

месяц - значение, используемое для установки поля времени МЕСЯЦ. Значение месяца: 0. например, 0 за январь.

1

Когда вы устанавливаете поле Calendar.MONTH, оно основано на нуле. {Январь = 0 ... Декабрь = 11}

0

Значения месяца идут от 0 (январь) до 11 (декабрь). Попробуйте использовать ((int) tmpMonth) - 1 при установке месяца для получения декабря.

1

Причина довольно проста: ошибка дизайна в API календаря. Вот почему JSR 310 находится на пути, чтобы улучшить поддержку java для дат.

Технически авторы этого сорта считали полезным использовать только статические поля. Так что вам нужно сделать, это использовать следующее:

calendar = ... 
calendar.setMonth(Calendar.JANUARY); 

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