Страницы

Поиск по вопросам

понедельник, 4 марта 2019 г.

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

При программировании на 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, и по календарю это суббота.


Ответ

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

Комментариев нет:

Отправить комментарий