Недавно был опубликован пост в котором достаточно подробно описывается алгоритм вычислении дня недели для любой даты в интервале 19хх — 20хх. В этой статье я приведу алгоритм, позволяющий максимально быстро вычислять день недели по заданной дате для текущего года, не требующий больших вычислительных усилий и запоминания таблиц.
В подавляющем большинстве случаев, если возникает необходимость определить день недели по конкретной дате, то эта дата именно текущего года. Причины отсутствия под рукой гаджета не оговариваются, мало ли их, да и владение таким навыком приравнивается к хранению в памяти календаря на текущий год.
Для нахождения дня недели для текущего года необходимо провести следующие действия:
d = [(a — m) mod 7] + 1
Где d — день недели,
a — число в дате,
m — число первого понедельника в месяце даты.
То есть (d — 1) — количество дней прошедших с ближайшего понедельника, прибавив 1 получаем порядковый номер дня недели.
Всё что необходимо знать — на какое число приходит первый понедельник каждого месяца, то есть нужно выучить 12 цифр, что сравнимо с длинной номера мобильного телефона или ip адресом.
Для 2014 года, последовательность (начиная с декабря) такая:163-375-274-163.
Первый понедельник декабря: 1-ое число, первый понедельник января: 6-ое число, февраля: 3-е и т.д.
Для визуализации и удобства запоминания последовательность из 12 цифр можно разбить на 4 блока, они же — времена года:

22 апреля:
d = [(22 — 7) mod 7] + 1 = 2 (вторник);
19 марта:
d = [(19 — 3) mod 7] +1 = 3 (среда);
В случае если же число раньше первого понедельника, можно либо отсчитывать дни в обратном порядке, сместить число на неделю вперёд:
2 августа:
d = [(2+7 — 4) mod 7] +1 = 6 (суббота).
Чтобы максимально приблизить модель календаря к реальному, было бы неплохо знать количество дней в каждом месяце, для этого я приведу давно известный способ определения количества дней на кулаке. Счёт начинается с января, если счёт попадает на костяшку, то количество дней 31, если на вогнутость между костяшками то 30, в феврале 28 (29 если год високосный).

Всё необходимое для воспроизведения календаря на текущий год всегда при себе. Есть недостаток — в начале каждого года необходимо запоминать новую последовательность цифр. Но это 5 минут на протяжении нескольких дней, и остальные 360 дней вспоминать её по мере необходимости. Отточив этот навык, день недели можно определять за 3 — 6 секунд.
В подавляющем большинстве случаев, если возникает необходимость определить день недели по конкретной дате, то эта дата именно текущего года. Причины отсутствия под рукой гаджета не оговариваются, мало ли их, да и владение таким навыком приравнивается к хранению в памяти календаря на текущий год.
Алгоритм
Для нахождения дня недели для текущего года необходимо провести следующие действия:
d = [(a — m) mod 7] + 1
Где d — день недели,
a — число в дате,
m — число первого понедельника в месяце даты.
То есть (d — 1) — количество дней прошедших с ближайшего понедельника, прибавив 1 получаем порядковый номер дня недели.
Необходимо запомнить
Всё что необходимо знать — на какое число приходит первый понедельник каждого месяца, то есть нужно выучить 12 цифр, что сравнимо с длинной номера мобильного телефона или ip адресом.
Для 2014 года, последовательность (начиная с декабря) такая:163-375-274-163.
Первый понедельник декабря: 1-ое число, первый понедельник января: 6-ое число, февраля: 3-е и т.д.
Для визуализации и удобства запоминания последовательность из 12 цифр можно разбить на 4 блока, они же — времена года:

Примеры
22 апреля:
d = [(22 — 7) mod 7] + 1 = 2 (вторник);
19 марта:
d = [(19 — 3) mod 7] +1 = 3 (среда);
В случае если же число раньше первого понедельника, можно либо отсчитывать дни в обратном порядке, сместить число на неделю вперёд:
2 августа:
d = [(2+7 — 4) mod 7] +1 = 6 (суббота).
Дополнительно: количество дней в месяце
Чтобы максимально приблизить модель календаря к реальному, было бы неплохо знать количество дней в каждом месяце, для этого я приведу давно известный способ определения количества дней на кулаке. Счёт начинается с января, если счёт попадает на костяшку, то количество дней 31, если на вогнутость между костяшками то 30, в феврале 28 (29 если год високосный).

Вывод
Всё необходимое для воспроизведения календаря на текущий год всегда при себе. Есть недостаток — в начале каждого года необходимо запоминать новую последовательность цифр. Но это 5 минут на протяжении нескольких дней, и остальные 360 дней вспоминать её по мере необходимости. Отточив этот навык, день недели можно определять за 3 — 6 секунд.