java Calendar возвращает неправильный день недели

267
08 июля 2017, 08:15

При программировании на java столкнулся с проблемой, что календарь не всегда правильно возвращает день недели. Пробовал использовать как Calendar, так и GregorianCalendar, но результат одинаковый.

Для примера:

GregorianCalendar calendar1 = new GregorianCalendar(196, 0, 1);
System.out.println(calendar1.get(GregorianCalendar.DAY_OF_WEEK));

Результатом в выводе будет 5, хотя по календарю: 01 января 196 - пятница, а значит мы должны были получить значение 6. Такая же проблема с годами:

  • 1036 (1 января - воскресенье, а возвращает 5)
  • 1316 (1 января - среда, а возвращает 5)
  • 1456 (1 января - вторник, а возвращает 5)

и др.

Но иногда возвращает и правильные значения. Например:

GregorianCalendar calendar2 = new GregorianCalendar(1600, 0, 1);
System.out.println(calendar2.get(GregorianCalendar.DAY_OF_WEEK));

вернет 7, и по календарю это суббота.

Answer 1

Отвечу сам на собственный вопрос.

Такая неразбериха с календарями получилась из-за отличий Григорианского и Юлианского календарей. В Юлианском календаре високосный год наступает каждый год, который кратный 4, а в Григорианском - високосными считаются года, которые делятся на 4, но не кратные 100 (за исключением годов, которые делятся на 400). Это означает, что постепенно разница между этими календарями увеличивается на 3 дня каждые 400 лет.

Т.к. на Григорианский практически все страны перешли только с 1582 года, то до этого времени все ресурсы и языки программирования (помимо Java сравнивал еще с Python) по-своему высчитывают этот период.

Что касается Java, то, как я понял, до 1582 года включительно в языке используется Юлианский календарь, а с 1583 - Григорианский.

Answer 2

Есть еще один нюанс про который забывает ТС:

Calendar defines a locale-specific seven day week using two parameters: the first day of the week and the minimal days in first week (from 1 to 7). These numbers are taken from the locale resource data when a Calendar is constructed. They may also be specified explicitly through the methods for setting their values.

Грубо говоря номер дня недели зависит от выбранной локали. В русском календаре первый день недели - понедельник, в западной традиции первый день недели воскресенье.

READ ALSO
Многократное нажатие на кнопку

Многократное нажатие на кнопку

По нажатию на кнопку делается обработка файлаНеобходимо при нажатии на нее еще раз, остановить обработку

318
Ограничить количество потоков

Ограничить количество потоков

Уважаемые знатоки!! Есть необходимость ограничить количество потоков до одного

205
Запрет переноса слов через дефис [дубликат]

Запрет переноса слов через дефис [дубликат]

На данный вопрос уже ответили:

318
Растянуть div на всю высоту родительского div

Растянуть div на всю высоту родительского div

ЗдравствуйтеЕсть три блока Div

453