Как по дате вычислить день недели?

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

 

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 — среда.

 

Ссылки: 

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