Фантазии о Вселенной и мой личный сайт
Универсальный календарь

Универсальный календарь

Мне очень, очень давно хотелось сделать асболютно универсальный и независимый от компьютера календарь. Сделать его таким, чтобы рассчитать день недели по заданному дню было легко и просто на калькуляторе. И мне это сделать удалось. Календарь работает, начиная с 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 в конечном расчете
  • Цифра после запятой в конце - не номер дня недели, соответствие смотреть в таблице