Настройка календаря Java неверна - PullRequest
1 голос
/ 04 января 2011

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

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

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

Ответы [ 6 ]

5 голосов
/ 04 января 2011

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

2 голосов
/ 04 января 2011

Из API:

month - значение, используемое для установки поля времени MONTH.Значение месяца основано на 0.например, 0 для января.

2 голосов
/ 04 января 2011

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

1 голос
/ 04 января 2011

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

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

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

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

1 голос
/ 04 января 2011

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

0 голосов
/ 04 января 2011

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

...