§ Вычисление

Мне очень, очень давно хотелось сделать асболютно универсальный и независимый от компьютера календарь. Сделать его таким, чтобы рассчитать день недели по заданному дню было легко и просто на калькуляторе. И мне это сделать удалось. Календарь работает, начиная с 1901 года и заканчивая 2100.

§ Алгоритм расчета

  • A = [ 365.25 * (ГОД - 1) ] — получаем целое число A
  • Если при умножении на 365.25 у нас осталась дробная часть "0.75" - это значит, что год не високосный, иначе - високосный.
Получаем значение B из следующей таблицы
 Янв Фев Мар Апр Май Июн Июл Авг Сен Окт Ноя Дек
Не високосный0315990120151181212243273304334
Високосный0315991121152182213244274305335
Дней в месяце3128/2931303130313130313031
День недели = (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 в конечном расчете
  • Цифра после запятой в конце - не номер дня недели, соответствие смотреть в таблице