Что умеет этот калькулятор
Вам когда-нибудь было интересно, в какой день недели вы появились на свет — это было ленивое воскресенье или хлопотливый понедельник? Калькулятор дня недели рождения точно определит, какой это был день недели, а в качестве бонуса покажет, на какой день недели выпадет ваш следующий день рождения. Расчёт работает для любой даты по григорианскому календарю.
Как пользоваться
Укажите год рождения, выберите месяц из выпадающего списка и введите день. Нажмите «Рассчитать». В верхнем блоке появится день недели, в который вы родились, а в таблице ниже — день недели вашего ближайшего дня рождения, чтобы можно было заранее спланировать праздник.
Как работает формула
В основе калькулятора лежит формула Целлера — классический алгоритм для определения дня недели по любой дате. Январь и февраль в нём рассматриваются как 13-й и 14-й месяцы предыдущего года. Формула вычисляет значение h, где 0 — суббота, 1 — воскресенье и так далее. Для удобства мы переводим результат в привычный порядок от воскресенья до субботы. Поскольку расчёт ведётся исключительно в целых числах, он абсолютно точен и не накапливает ошибок.
$$h = \left( D + \left\lfloor \frac{13(m+1)}{5} \right\rfloor + K + \left\lfloor \frac{K}{4} \right\rfloor + \left\lfloor \frac{J}{4} \right\rfloor + 5J \right) \bmod 7$$
Разбор примера
Возьмём 15 июля 1990 года. Здесь \(m = 7\), \(d = 15\), год = 1990, поэтому \(k = 90\), а \(j = 19\). Тогда $$h = (15 + \lfloor 13\cdot 8/5 \rfloor + 90 + \lfloor 90/4 \rfloor + \lfloor 19/4 \rfloor + 5\cdot 19) \bmod 7 = (15 + 20 + 90 + 22 + 4 + 95) \bmod 7 = 246 \bmod 7 = 1,$$ то есть воскресенье. Значит, человек, родившийся 15 июля 1990 года, появился на свет в воскресенье.
Частые вопросы
Работает ли калькулятор со старыми датами? Да, для любой даты по пролептическому григорианскому календарю. Для дат до календарной реформы 1582 года результат может отличаться от исторических записей, которые велись по юлианскому календарю.
Как учитываются високосные годы? Формула Целлера автоматически обрабатывает високосные годы за счёт модульной арифметики, поэтому даты 29 февраля рассчитываются верно.
Что, если мой день рождения в этом году уже прошёл? Если день рождения в текущем году уже состоялся, расчёт ближайшего дня рождения автоматически перейдёт на следующий год.
Определения переменных
- \(D\) — День месяца. Календарный день в точности так, как он записан, от 1 до 31. К \(D\) никогда не применяется никаких корректировок.
- \(m\) — Скорректированный номер месяца. Март = 3 по декабрь = 12 используются без изменений. Январь и февраль — особые: они рассматриваются как месяцы 13 и 14 предыдущего года. Это потому, что сравнение Зеллера рассматривает март как начало года, что оставляет день високоса в конце цикла.
- \(Y\) — Скорректированный год. Если дата приходится на январь или февраль, вычтите 1 из календарного года (так как эти месяцы принадлежат предыдущему году в этой схеме). Все остальные месяцы сохраняют исходный год.
- \(K\) — Год века. \(K = Y \bmod 100\), т. е. последние две цифры скорректированного года. Для 2024 это 24; для 1999 это 99.
- \(J\) — Век с нулевой индексацией. \(J = \lfloor Y / 100 \rfloor\), номер века без округления в большую сторону. Для 2024 это 20; для 1999 это 19.
- \(h\) — Полученный код дня. Остаток по модулю 7 после объединения всех членов, дающий значение 0–6, которое отображается на день недели с использованием таблицы кодов результатов выше.
Дополнительные работанные примеры
Пример 1 — Дата в январе (демонстрация сдвига месяца и года)
Возьмем 15 января 2000 г.. Поскольку месяц — январь, установите \(m = 13\) и используйте предыдущий год, поэтому скорректированный год составляет \(Y = 1999\). Затем \(D = 15\), \(K = 1999 \bmod 100 = 99\), и \(J = \lfloor 1999/100 \rfloor = 19\).
$$h = \left(15 + \left\lfloor \tfrac{13(13+1)}{5} \right\rfloor + 99 + \left\lfloor \tfrac{99}{4} \right\rfloor + \left\lfloor \tfrac{19}{4} \right\rfloor + 5 \cdot 19 \right) \bmod 7$$
Члены пола равны \(\lfloor 182/5 \rfloor = 36\), \(\lfloor 99/4 \rfloor = 24\) и \(\lfloor 19/4 \rfloor = 4\). Суммируя: \(15 + 36 + 99 + 24 + 4 + 95 = 273\). Затем \(273 \bmod 7 = 0\), поэтому \(h = 0\) → суббота. 15 января 2000 года была действительно суббота.
Пример 2 — День рождения в день високоса (29 февраля 2000 г.)
Для 29 февраля 2000 г. февраль также сдвигается: \(m = 14\) и скорректированный год составляет \(Y = 1999\), дающий \(K = 99\), \(J = 19\) и \(D = 29\).
$$h = \left(29 + \left\lfloor \tfrac{13(14+1)}{5} \right\rfloor + 99 + \left\lfloor \tfrac{99}{4} \right\rfloor + \left\lfloor \tfrac{19}{4} \right\rfloor + 5 \cdot 19 \right) \bmod 7$$
Здесь \(\lfloor 195/5 \rfloor = 39\), \(\lfloor 99/4 \rfloor = 24\), \(\lfloor 19/4 \rfloor = 4\). Суммируя: \(29 + 39 + 99 + 24 + 4 + 95 = 290\), и \(290 \bmod 7 = 3\), поэтому \(h = 3\) → вторник. 29 февраля 2000 года было вторником. Обратите внимание, что 2000 год является високосным, потому что он делится на 400.
Пример 3 — Недавняя дата (4 июля 2023 г.)
Для 4 июля 2023 г. июль — обычный месяц, поэтому \(m = 7\) без изменения года: \(Y = 2023\), \(D = 4\), \(K = 23\), \(J = 20\).
$$h = \left(4 + \left\lfloor \tfrac{13(7+1)}{5} \right\rfloor + 23 + \left\lfloor \tfrac{23}{4} \right\rfloor + \left\lfloor \tfrac{20}{4} \right\rfloor + 5 \cdot 20 \right) \bmod 7$$
Полы: \(\lfloor 104/5 \rfloor = 20\), \(\lfloor 23/4 \rfloor = 5\), \(\lfloor 20/4 \rfloor = 5\). Суммируя: \(4 + 20 + 23 + 5 + 5 + 100 = 157\), и \(157 \bmod 7 = 3\), поэтому \(h = 3\) → вторник. День независимости 2023 года был вторником.