Как найти день недели по дате формула

Как определить день недели по дате, не заглядывая в календарь

Чтобы без помощи календаря определить день недели для любой даты, не обязательно быть гением или ясновидящим. Достаточно запомнить пару формул. Заодно это упражнение может стать неплохой тренировкой для ума и памяти.

Как определить день недели по дате, не заглядывая в календарь

Для определения дня недели по дате нужно использовать формулу:

день недели = (день + код месяца + код года) % 7

Пояснения

Код месяца

Коды месяца и года — это, пожалуй, самое трудное в формуле.

Код месяца нужно просто запомнить.

  • 1 — январь, октябрь;
  • 2 — май;
  • 3 — август;
  • 4 — февраль, март, ноябрь;
  • 5 — июнь;
  • 6 — декабрь, сентябрь;
  • 0 — апрель, июль.

Чтобы запоминать подобные нелогичные данные, проще всего прибегать к ассоциациям.

Код года

Код года в XXI веке рассчитывается по формуле:

код года = (6 + последние две цифры года + последние две цифры года / 4) % 7

Оператор «/» означает неполное частное, то есть целую часть результата деления.

  • 2015 год: (6 + 15 + 15 / 4) % 7 = (6 + 15 + 3) % 7 = 24 % 7 = 4;
  • 2016 год: (6 + 16 + 16 / 4) % 7 = (6 + 16 + 4) % 7 = 26 % 7 = 5;
  • 2017 год: (6 + 17 + 17 / 4) % 7 = (6 + 17 + 4) % 7 = 27 % 7 = 6;
  • 2026 год: (6 + 26 + 26 / 4) % 7 = (6 + 26 + 6) % 7 = 38 % 7 = 3.

Если вы захотите узнать день недели для даты другого века, придётся учитывать ещё значения века (6, 4, 2, 0). Вместо 6 для ближайших веков будут следующие значения:

  • 16хх: 6;
  • 17хх: 4;
  • 18хх: 2;
  • 19хх: 0;
  • 20хх: 6;
  • 21хх: 4 и так далее.

% 7

Здесь просто: % — оператор остатка при делении.

Расшифровка результата

Старт отсчёта — выходные, то есть: 0 — суббота, 1 — воскресенье и так далее.

Примеры расчёта

  • 25 июля 2016 года: (25 + 0 + 5) % 7 = 30 % 7 = 2 — понедельник;
  • 8 августа 2017 года: (8 + 3 + 6) % 7 = 17 % 7 = 3 — вторник;
  • 5 января 2127 года:
    • (4 + 27 + 27 / 4) % 7 = (4 + 27 + 3) % 7 = 34 % 7 = 6 — код года;
    • (5 + 1 + 6) % 7 = 10 % 7 = 5 — четверг.

Конечно, расчёт дня недели по дате в уме — это не жизненно важный навык в век технологий. Но это нетривиальное упражнение для всех, кто любит развивать свою память и проводить операции с цифрами.

UPD. К сожалению, эта формула не совсем верно работает для високосного года. До 29 февраля включительно к формуле придётся прибавить ещё единицу, чтобы получить верный день. Спасибо читателям, что обнаружили ошибку.

Чтобы найти день недели математически необходимо пронумеровать все дни недели

так, чтобы следующий день недели был на 1 больше предыдущего, начиная с 1:

1-понедельник,2-вторник,3-среда,4-четверг,5-пятница,6-суббота,7-воскресенье

Чтобы найти день недели дня, отстоящего на N дней подойдет формула D₁=D+(N mod 7)

если надо определить какой день недели был раньше известного дня то остаток будет отрицательным и возможно получение отрицательного числа D₁

D₁=D+(остаток отделения N на 7)

если D₁ > 7 то D₁=D₁-7

если D₁ < 0 то D₁=D₁+7

где D₁- искомый день недели, а D — день недели известного дня отстоящего на N дней

Пример

16 февраля 2017 года — четверг D=4

Ищем день недели 5 марта 2017 года

05-03-2017 — 16-02-2017=17 дней

остаток от деления 17 на 7 равен 3

D₁=4+(остаток отделения N на 7)=4+3=7 — воскресенье

Ищем день недели 8 марта 2017 года

08-03-2017 — 16-02-2017=20 дней

остаток от деления 20 на 7 равен 6

D₁=4+(остаток отделения N на 7)=4+6=10

D₁ > 7 получаем D₁=D₁-7=10-7=3 это среда

Ищем день недели 16 февраля 2017 года,

зная что 8 марта 2017 года — среда D=3

N=-20 остаток от деления 20 на 7 равен 6 берём с обратным знаком равно -6

D₁=3+(-6)=-3

D₁ < 0 получаем D₁=D₁+7=-3+7=4 это четверг

Вычисление дня недели в уме

Время на прочтение
4 мин

Количество просмотров 99K

imageСуществует множество способов прокачать мозг. Задачи «n-back» или мобильные приложения для тренировки навыка быстрого счета в уме. Но эти задачи оторваны от текущей реальности, а хотелось бы прокачать мозг практичным навыком.

Зачем? Ведь можно быстро посчитать на гаджете. Увы, совсем не быстро, т.к. потребуется время на поиски и активацию гаджета, поиск приложения, ввод даты, осознание полученного результата. А еще можно друзей/подруг порадовать своими внезапно появившимися экстраординарными способностями. Кстати, друзья быстро осознают удобство использования вечного календаря с голосовым интерфейсом.

Разве это возможно? Как-то раньше обходились без компьютеров. В одной из тв-передач «ищем таланты» показывали натренированного трехлетнего ребенка, который может вычислять произведение трехзначных чисел (пощадите своих детей). Впрочем, взрослые уже не дети и их мозг частично кристаллизован, в смысле слабо обучаем. Значит нужно запоминать как можно меньше и максимально задействовать имеющиеся навыки.

В алгоритмике часто объемы вычислений могут быть скомпенсированы объемами памяти. Т.е. чем больше оперативки доступно, тем меньше потребуется вычислений. Аналогично работает мозг – чем больше мы запомнили, тем быстрее ищем решение. Запомнили несколько формул для сборки кубика Рубика – соберете за пару минут (после длительной тренировки). Запомнили полторы сотни формул – соберете за пару десятков секунд. Мировой рекорд 2013 года – 8.18 сек. Еще раз: чем больше помним – тем быстрее решение.

Алгоритм

Нужно взять смещение (день недели) первого дня года (y) и смещение месяца (m). Затем вычислить сумму y+m+d, где d – день месяца, и найти остаток от деления на 7. Получим номер дня недели.

Что нужно запомнить

Размышления

В целом, достаточно запомнить все дни недели всех 28 лет (периодичность пропорциональна произведению периодов високосных лет и дней недели). Последовательность в 10k. Это довольно много.

Если добавить одну операцию сложения, то будет достаточно запомнить лишь пару рядов чисел:

m(month) = { 6 2 2 5 0 3 5 1 4 6 2 4 }, с января по декабрь

y(year) = { 6 0 1 2 4 5 6 0 2 3 4 5 0 1 2 3 5 6 0 1 3 4 5 6 1 2 3 4 }, с 1988 по 2015

Например: 13 сентября 2013 = (13 + 4 + 2) % 7 = 5 (пятница)

Смещения для месяца берутся из календаря некоторого года. Смещение месяца равно количеству серых квадратов в начале месяца. Например, не високосный 2006 год. Смещение для этого года будет 0.

image

Все же запомнить смещения для всех лет и затем выполнять быстрый поиск по индексу довольно сложная когнитивная задача. Есть альтернативный путь – вычислить. Нужно взять две последние цифры года (+100 для XXI века) — Y. Далее найти ближайший прошлый високосный Yв. Взять dY = Y – Yв. Тогда смещение года можно вычислить

y(Y) = (50 – Yв/2 + dY)

Недостаток формулы в том, что для 2004 и далее смещение будет отрицательным, а для начала и середины XX века двузначными, что слегка затрудняет вычисления в уме. Можно использовать разные формулы для каждого века, в которых учитываются только две младшие цифры года. Например, 12 для 2012г и 1912г.

XX: (50 – Yв/2 + dY) % 7 или (8 – Yв/2 % 7 + dY)
XXI: (7 – Yв/2 % 7 + dY)

В итоге может оказаться проще запомнить таблицу смещений в таком виде:

image

Смещение для года можно вычислить через сумму смещения ближайшего меньшего високосного года и его разницы с искомым годом. Семь цифр запомнить проще чем 28. К тому же, цифры расположены в убывающем порядке с шагом 2. (Да, да, (0 – 2) будет 5, помним про остаток от деления на 7). Можно запомнить цифры (6, 4, 2, 0, -2, -4, -6), что при вычислениях даст аналогичный результат. Года кратные 20 располагаются в косом квадрате 3х3 по схеме «ход конем» c 2000 годом в центре. Значения смещений месяцев и лет согласованы так, чтобы на 2000 год приходилось смещение 0. А шаг между соседними рядами 28 лет.

Например, для 2014 смещение будет y(2014) = y(2012) + 2 = 1 + 2 = 3. А день программиста 13 сентября 2014 года будет (y(2014) + m(сен) + 13) = (3 + 4 + 13) = 20 => 20 % 7 = 6, т.е. суббота.

Структурируем ряд смещений для месяцев. Значения удобно запоминать по сезонам: весна, лето, осень, зима.

image

Обратите внимание, что вдруг (?), в порядке сверху вниз и слева направо, цифры выстроились в возрастающий ряд (первая цветная таблица). Можно запоминать только остатки от деления на 7 (вторая цветная таблица) или для восстановления всей таблицы запомнить только разности (последняя таблица). Прибавляя 1 к 1, получим для марта 2, для июня 2+1=3, для сентября 3+1=4 и т.д. Одинаковые значения раскрашены в одинаковые цвета. Для быстрого поиска нам поможет вторая цветная таблица. Помним, что строки — это сезоны, начиная с весны. Это крайне непривычно. Но в древнем Риме год начинался именно с марта. Это отражено в названиях месяцев латинскими цифрами: September/October/November/December – 7/8/9/10, т.е. февраль был последним 12м месяцем года, к которому добавляли високосный день.

image

12 апреля 1961 года: (6 + 1 + 5 + 12) = (0 + 5 + 12) => 17 % 7 = 3 – среда.

Важно!!! У программистов вечная проблема с потерянной единицей. В нашей задачке без этого не обошлось. Для января и февраля високосного года нужно вычитать единицу.

14 февраля 2012 = (y(2012)+m(фев)+14) — 1 = (1 + 2 +14) — 1 => 16 % 7 = 2, т.е. вторник.

Еще нужно помнить, что не все года что делятся на 4 будут високосными (исключения — 2100, 1900, 1800, ….). Соответственно, необходимо учесть смещение для века. Впрочем, даже если не учитывать последнее исключение можно безошибочно оперировать днями недели за XX и XXI века, что достаточно для большинства житейских случаев.

Немного оптимизации.

Вычисления можно производить в потоковом режиме. Обычно дату рождения (или любую другую дату) сообщают начиная с дня месяца, например, 23 декабря 1913 года. Т.е. в процессе сообщения даты можно частично вычислить искомую сумму 23 + m(дек) = 27 или даже 23 % 7 + m(дек) = 2 + 4 = 6 и затем уже задуматься y(1913) = y(1912) + 1 = 3. В итоге сообщить 30 % 7 = (6 + 3) % 7 = 2, вторник.

Часто приходится оперировать датами текущего года. Т.е. смещение года вы всегда будете помнить, т.к. от частого использования значение «закэшируется». Например, для 2014 смещение равно 3.

Что мы получили. Правила заполнения таблиц простые и вы скорее всего их запомнили и сможете воспроизвести себе шпаргалку в любом месте в любое время. Но для быстрого счета таблицы проще заучить целиком. Ведь мы не восстанавливаем таблицы сложения и умножения для расчета сдачи перед кассой. Эти таблицы «прошиты» еще в начальной школе. Для запоминания таблиц легче всего воспользоваться тренажером Week Brain Calc (Windows Phone).

После непродолжительной тренировки можно порадовать любимых своими уникальными способностями.

Когда под рукой нет календаря, для того чтобы определить, какой сегодня день недели, можно воспользоваться следующим алгоритмом:

1. Обозначим число, месяц и год соответственно d, m и y.

2. Если m ≤ 2 (т.е. месяц январь или февраль), то год уменьшим на 1, а число увеличим на 3:

    y:= y–1; 

    d:= d+3;

3. Теперь номер дня недели (w) вычисляется по следующей формуле:

    w:= 1 + [d + y + y/4 – y/100 + y/400 + (31m+10)/12] mod 7;

(все операции деления — целочисленные, т.е. берется целая часть частного; mod — операция получения остатка от деления).

Результатом будет целое число в диапазоне от 1 до 7, соответствующее дням недели от воскресенья до субботы (1 — понедельник, 2 — вторник, 3 — среда, 4 — четверг, 5 — пятница, 6 — суббота, 7 — воскресенье).

Данный алгоритм получен модификацией широко известного алгоритма вычсиления дня недели.

Преимущества модифицированного алгоритма:

  • не требует использования вспомогательных переменных;
  • удобен в языках программирования, использующих передачу параметров по значению;
  • дает результат, соответствующий русской традиции нумерации дней недели, начиная с понедельника. 

Алгоритм работает в пределах применимости григорианского календаря.

Примеры:

1. Текущая дата: 27.09.2009

d = 27;

m = 9;

y = 2009;

Поскольку m > 2, сразу переходим к п.3

w = 1 + [27 + 2009 + 2009/4 – 2009/100 + 2009/400 + (31*9+10)/12] mod 7 =

   = 1 + [27 + 2009 + 502 – 20 + 5 + 24] mod 7 = 1 + 6 = 7 — воскресенье.

2. Текущая дата: 31.01.1968

d = 31;

m = 1;

y = 1968;

Поскольку m ≤ 2, введем коррекцию:

y = 1967;

d = 34;

Теперь вычисляем:

w = 1 + [34 + 1967 + 1967/4 – 1967/100 + 1967/400 + (31*1+10)/12] mod 7 =

   = 1 + [34 + 1967 + 491 – 19 + 4 + 3] mod 7 = 1 + 2= 3 — среда.

Ссылки: 

  • Алгоритм вычисления дня недели — Википедия.

Дополнительно на Геноне:

  • Как по дате определить день недели?
  • Что такое григорианский календарь?
  • Почему в разные годы одна и та же дата приходится на разные дни недели?
  • Где найти астрономический календарь?
  • Как самому расcчитать дату Пасхи?

Понравилась статья? Поделить с друзьями:
  • Как составить приказ на излишки
  • Как найти театр диониса в афинах
  • Как исправить ошибку с драйверами видео
  • Как найти продолжительность включения
  • Как найти объем квадратного конуса