Универсальный календарь
Универсальный календарь
Мне очень, очень давно хотелось сделать асболютно универсальный и независимый от компьютера календарь. Сделать его таким, чтобы рассчитать день недели по заданному дню было легко и просто на калькуляторе. И мне это сделать удалось. Календарь работает, начиная с 1901 года и заканчивая 2100.
Алгоритм расчета:
- $A = [ 365.25 * (ГОД - 1) ] -- получаем целое число $A
- Если при умножении на 365.25 у нас осталась дробная часть "0.75" - это значит, что год не високосный, иначе - високосный
-
Получаем значение $B из следующей таблицы:
Янв Фев Мар Апр Май Июн Июл Авг Сен Окт Ноя Дек Не високосный 0 31 59 90 120 151 181 212 243 273 304 334 Високосный 0 31 59 91 121 152 182 213 244 274 305 335 Дней в месяце 31 28/29 31 30 31 30 31 31 30 31 30 31 -
День недели = ($A + $B + День + 5) / 7.
При делении необходимо узнать первую цифру после запятой, и по таблице определить день недели:
Цифра после запятой День недели 0 Понедельник 1 Вторник 2 Среда 4 Четверг 5 Пятница 7 Суббота 8 Воскресенье
Пример расчета
Возьмем 2063 год, 12 мая. Итак
- 365.25 * (2063 - 1) = 753145,5
- $A = 753145, год - не високосный (т.к. 0,5 есть)
- $B = 120 из таблицы для не високосного года
- День = (753145год + 120месяц + 12день + 5коррекция) / 7 = 753282 / 7 = 107611,714286
- Первая цифра после запятой - "7", значит, судя по таблице, это Суббота.
Основные проблемы
- Нельзя забывать вычитать -1 из года
- Не забывать прибавлять +5 в конечном расчете
- Цифра после запятой в конце - не номер дня недели, соответствие смотреть в таблице