2013-10-02 1 views
4

Моя проблема, по-видимому, очень проста. Я создаю графический пользовательский интерфейс календаря, из объекта GregorianCalendar, и использует его методы для расчета правильного количества дней в разные месяцы и разных рабочих дней в разные дни.Почему мой объект GregorianCalendar возвращает неправильный день недели?

Но будние дни являются постоянными один день. Календарь утверждает, что 1 июля 2013 года это «2», что в моей части света означает вторник. Это должно было быть «1» в понедельник. "Легко!" я думаю, и положил в строку: c.setFirstDayOfWeek (Calendar.MONDAY); Но реакция не дается.

Так что я ищу stackoverflow для ответа, но все с моей проблемой, похоже, забыли, что январь равен 0, а не 1. У меня нет. Так что теперь я застрял.

Как simplifyed код, я сделал очень короткий кусок кода, с его соответствующий выход:

GregorianCalendar c = new GregorianCalendar(); 
    c.setFirstDayOfWeek(Calendar.MONDAY); 
    c.set(Calendar.MONTH, 6); 
    c.set(Calendar.DAY_OF_MONTH, 1); 
    c.set(Calendar.YEAR, 2013); 

    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-YYYY"); 
    System.out.println(sdf.format(c.getTime())); 
    System.out.println(c.get(Calendar.DAY_OF_WEEK)); 

и выход:

01-07-2013

Я отказываюсь вставить «-1» в свой код, чтобы неправильно исправить симптомы ошибки. Помощь приветствуется.

+0

Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

+4

2 - понедельник ... 1 - воскресенье ... Кроме того, setFirstDayOfWeek, согласно документу: 'Первая неделя месяца или года определяется как самый ранний семидневный период, начинающийся с getFirstDayOfWeek() и содержащий по крайней мере getMinimalDaysInFirstWeek () дней этого месяца или года. Там нет «очевидной ошибки». Просто проблема локализации ... – ppeterka

+0

Спасибо. На данный момент я перестала пытаться установить понедельник в качестве первого дня недели. Мне просто проще было изменить мой другой код, чтобы ожидать, что воскресенье - номер 1, независимо от того, насколько он нелогичен мне. Благодарим за сообщение, что моя ошибка была моей интерпретацией метода setFirstDayOfWeek(). Этого было бы трудно найти самостоятельно. Мне жаль, что я не могу принять это как ответ, но похоже, что он опубликован только как комментарий. – KjetilNordin

ответ

10

Я отказываюсь вставить «-1» в свой код, чтобы неправильно исправить симптомы того, что, очевидно, является ошибкой.

Ошибка сделана в том, что Calendar.get(Calendar.DAY_OF_WEEK) локализован. Это не так. Исправлено отображение между днями недели и числом; используйте Calendar.getFirstDayOfWeek(), чтобы определить человеческое понимание «первого дня недели», если вам нужно; Я был бы удивлен, если бы вы действительно хотели показать пользователю «2» в любом случае ... конечно, вы хотели бы показать им имя дня недели.

Любой расчеты с началом недели должны использовать getFirstDayOfWeek.

+0

Это именно то, что мне удалось получить из более раннего комментария. Удивительный ответ! Благодарю. И как дополнительный комментарий; Я проанализировал целочисленное значение на другое значение перечисления WeekDay, чтобы я мог получить имя дня недели на моем родном языке. Еще раз спасибо. – KjetilNordin

+0

@KjetilNordin: В идеале используйте 'DateFormatSymbols.getInstance (locale) .getWeekdays()' для этого. –

12

Да, обработка даты в Java проблематично ...

  • Месяцы начинаются с 0 (январь)
  • дни недели начала с SUNDAY быть 1, SATURDAY быть семь (Ideone fiddle)
  • c.setFirstDayOfWeek (Calendar.MONDAY); это немного отличается от того, что следует из названия

    Первая неделя месяц или год определяется как ранний семидневного периода, начинающегося getFirstDayOfWeek() и содержащий, по меньшей мере, getMinimalDaysInFirstWeek() дней этого месяца или

    года

Вы можете выйти из неприятностей по всегда, используя константы, определенные в классе Calendar и даже не пытается вывести любое значение из численных представлений этих констант, или результат ы, возвращаемый методом Calendar.get(int) ...

+0

Это тоже хороший ответ +1. Я работаю с объектами календаря в течение большей части шести месяцев, и я многому научился, благодаря таким парням, как вы. Мне нравится формулировка заключительного абзаца в вашем ответе. – KjetilNordin

1

Это одна из предостережений в Java,

DAY_OF_WEEK,

Это поле принимает значения воскресенье, понедельник, вторник, среда, четверг, пятница , и СУББОТА.

Когда ваша программа печатает 2, это говорит вам, что день недели - ПОНЕДЕЛЬНИК. Это постоянное значение не имеет ничего общего с началом недели. Похоже, что это совпадает с днем ​​недели, если первый день недели - ВОСКРЕСЕНЬЕ - но это не изменится, если переопределить первый день недели.