- Алгоритм вычисления дня недели
-
Алгоритм вычисления дня недели
Существует довольно простой алгоритм вычисления дня недели для любой даты григорианского календаря позднее 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;
Реализация на PHP:
function getDay($day, $mon, $year) { $days = array("воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "суббота"); $day = (int)$day; //если день двухсимвольный и <10 $mon = (int)$mon; //если месяц двухсимвольный и <10 $a = (int)((14 - $mon) / 12); $y = $year - $a; $m = $mon + 12 * $a - 2; $d = (7000 + (int)($day+$y+ (int)($y/4) - (int)($y/100) + (int)($y/400) + (31*$m)/12))%7; return $days[$d]; }
Реализация в MS SQL:
CREATE FUNCTION [dbo].[getDay]( @date datetime ) RETURNS int AS BEGIN declare @a int declare @y int declare @m int
set @a = (14 - MONTH(@date)) / 12 set @y = YEAR(@date) - @a set @m = MONTH(@date) + 12*@a-2
return (7000 + (DAY(@date) + @y + @y / 4 - @y / 100 + @y / 400 + (31 * @m) / 12)) % 7
END
См. также
Ссылки
Wikimedia Foundation. 2010.