Алгоритм вычисления дня недели

Материал из Википедии — свободной энциклопедии

Перейти к: навигация, поиск

Существует довольно простой алгоритм вычисления дня недели для любой даты григорианского календаря позднее 1583 года. Григорианский календарь начал действовать в 1582 — после 4 октября сразу настало 15 октября.

Положим год — год, месяц — номер месяца, день — день, тогда

a = (14 − месяц) / 12
y = год − a
m = месяц + 12 * a − 2
ДеньНедели = (7000 + (день + y + y / 4 − y / 100 + y / 400 + (31 * m) / 12)) ОСТАТОК 7

Все деления целочисленные (остаток отбрасывается).

Результат: 0 — воскресенье, 1 — понедельник и т. д.

[править] Реализации алгоритма

Для JavaScript код выглядит следующим образом:

function getDay(day,mon,year){
 var days = new Array("воскресенье","понедельник","вторник","среда","четверг","пятница","суббота");
 day=parseInt(day); //если день двухсимвольный и <10 
 mon=parseInt(mon); //если месяц двухсимвольный и <10 
 var a=parseInt((14-mon)/12);
 var y=year-a;
 var m=mon+12*a-2;
 var d=(7000+parseInt(day+y+parseInt(y/4)-parseInt(y/100)+parseInt(y/400)+(31*m)/12))%7;
 return days[d];
}

Реализация на C:

struct struct_date
{
    char day;
    char month;
    short year;
};
 
int what_day(const struct struct_date * const date)
{
    int a = (14 - date->month) / 12;
    int y = date->year - a;
    int m = date->month + 12 * a - 2;
    return (7000 + (date->day + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12)) % 7;
}

Реализация на Delphi:

function WhatDay(Year: Integer; Month: Integer; Day: Integer):integer;
var a,y,m: integer;
begin
 a := (14 - Month) div 12;
 y := year - a;
 m := month + 12 * a - 2;
 Result := (7000 + (day + y + y div 4 - y div 100 + y div 400 + (31 * m) div 12)) mod 7;
end;

[править] См. также

[править] Ссылки