При программировании на java столкнулся с проблемой, что календарь не всегда правильно возвращает день недели. Пробовал использовать как Calendar, так и GregorianCalendar, но результат одинаковый.
Для примера:
GregorianCalendar calendar1 = new GregorianCalendar(196, 0, 1);
System.out.println(calendar1.get(GregorianCalendar.DAY_OF_WEEK));
Результатом в выводе будет 5, хотя по календарю: 01 января 196 - пятница, а значит мы должны были получить значение 6. Такая же проблема с годами:
и др.
Но иногда возвращает и правильные значения. Например:
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 - Григорианский.
Есть еще один нюанс про который забывает ТС:
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.
Грубо говоря номер дня недели зависит от выбранной локали. В русском календаре первый день недели - понедельник, в западной традиции первый день недели воскресенье.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
По нажатию на кнопку делается обработка файлаНеобходимо при нажатии на нее еще раз, остановить обработку
Уважаемые знатоки!! Есть необходимость ограничить количество потоков до одного