Реализации алгоритмов/Вечный календарь: различия между версиями
м исправление (убран вводящий в заблуждение комментарий) |
Нет описания правки |
||
Строка 1: | Строка 1: | ||
{{wikipedia|Вечный календарь}} |
{{wikipedia|Вечный календарь}} |
||
= |
=Описание= |
||
Существует довольно простой '''алгоритм вычисления дня недели''' для любой даты [[w:Григорианский календарь|григорианского календаря]], начиная с первого дня его действия — 15 октября [[w:1583|1583]] года. (Предыдущим днём было 4 октября, числа с 5 по 14 октября включительно были пропущены для устранения 11‑дневного отставания от фактической даты, накопившегося за время использования [[w:Юлианский календарь|юлианского календар]]). |
|||
Положим, дата задана так: ''год'' — год (от 1583), ''месяц'' — номер месяца (1…12), ''число'' — число месяца (1…31, согласно числу дней в соответствующем месяце), тогда: |
|||
Существует довольно простой '''алгоритм вычисления дня недели''' для любой даты [[w:Григорианский календарь|григорианского календаря]] позднее [[w:1583|1583]] года. Григорианский календарь начал действовать в [[w:1582|1582]] — после 4 октября сразу настало 15 октября. |
|||
Положим ''год'' — год, ''месяц'' — номер месяца, ''день'' — день, тогда |
|||
a = (14 − месяц) / 12 |
a = (14 − месяц) / 12 |
||
y = год − a |
y = год − a |
||
m = месяц + 12 * a − 2 |
m = месяц + 12 * a − 2 |
||
ДеньНедели = ( |
ДеньНедели = (число + (31 * m) / 12 + y + y / 4 − y / 100 + y / 400) ОСТАТОК 7 |
||
либо, что почти то же самое: |
|||
Все деления целочисленные (остаток отбрасывается). |
|||
если месяц = 1 или месяц = 2: // январь или февраль |
|||
Результат: 0 — воскресенье, 1 — понедельник и т. д. |
|||
год = год − 1 |
|||
месяц = месяц + 10 |
|||
иначе: |
|||
месяц = месяц − 2 |
|||
всё |
|||
ДеньНедели = (число + (31 * месяц) / 12 + год + год / 4 − год / 100 + год / 400) ОСТАТОК 7 |
|||
Деление производится нацело (с отбрасыванием остатка). |
|||
== Реализации алгоритма == |
|||
Результат: 0 — воскресенье, 1 — понедельник и т. д. |
|||
=== [[Arduino IDE]] === |
|||
Для Arduino IDE код выглядит следующим образом: |
|||
<source lang="C"> |
|||
=Реализации= |
|||
==[[Arduino IDE]]== |
|||
<source lang="C"> |
|||
//========================================================================================== |
//========================================================================================== |
||
//Глобальные переменные |
//Глобальные переменные |
||
Строка 53: | Строка 60: | ||
</source> |
</source> |
||
== |
==[[w:Бейсик|BASIC]]== |
||
===[[w:GW-BASIC|GW-BASIC]] и совместимые диалекты=== |
|||
Для JavaScript код выглядит следующим образом: |
|||
<source lang="basic"> |
|||
10 INPUT "Year", Y%: INPUT "Month", M%: INPUT "Day", D% |
|||
20 IF M% < 3 THEN Y% = Y% - 1: M% = M% + 10: ELSE M% = M% - 2 |
|||
30 PRINT "Weekday: "; (D% + 31 * M% \ 12 + Y% + Y% \ 4 - Y% \ 100 + Y% \ 400) MOD 7 |
|||
</source> |
|||
===[[w:QuickBasic|QuickBasic]] версий < 4.0, [[w:Turbo Basic|Turbo Basic]]=== |
|||
<source lang="JavaScript"> |
|||
<source lang="basic"> |
|||
function getDay(day,mon,year){ |
|||
DEF FNWD%(Y%, M%, D%) |
|||
var days = ["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"]; |
|||
IF M% < 3 THEN |
|||
day=parseInt(day, 10); //если день двухсимвольный и <10 |
|||
Y% = Y% - 1 |
|||
mon=parseInt(mon, 10); //если месяц двухсимвольный и <10 |
|||
M% = M% + 10 |
|||
var a=parseInt((14-mon)/12, 10); |
|||
ELSE |
|||
var y=year-a; |
|||
M% = M% - 2 |
|||
END IF |
|||
var d=(parseInt(day+y+parseInt(y/4, 10)-parseInt(y/100, 10)+parseInt(y/400, 10)+(31*m)/12, 10))%7; |
|||
FNWD% = (D% + 31 * M% \ 12 + Y% + Y% \ 4 - Y% \ 100 + Y% \ 400) MOD 7 |
|||
return days[d]; |
|||
END DEF |
|||
} |
|||
</source> |
</source> |
||
===[[w:PowerBASIC|PowerBASIC]], [[w:QBASIC|QBASIC]], [[w:QuickBasic|QuickBasic]] версий ≥ 4.0, [[w:Visual Basic|Visual Basic]]=== |
|||
=== [[Язык Си в примерах|C]] === |
|||
<source lang="vb"> |
|||
Реализация на C: |
|||
Function Weekday (year As Integer, month As Integer, day As Integer) As Integer |
|||
If month < 3 Then |
|||
year = year - 1 |
|||
month = month + 10 |
|||
Else |
|||
month = month - 2 |
|||
End If |
|||
Weekday = (day + 31 * month \ 12 + year + year \ 4 - year \ 100 + year \ 400) Mod 7 ' Для VB.NET следует заменить Weekday = на Return |
|||
End Function |
|||
</source> |
|||
==[[Язык Си в примерах|C]], [[C++]]== |
|||
<source lang="C"> |
<source lang="C"> |
||
typedef unsigned short Year; |
|||
struct struct_date |
|||
typedef unsigned char Month; |
|||
{ |
|||
typedef unsigned char Day; |
|||
short day; |
|||
typedef unsigned char Weekday; |
|||
short month; |
|||
short year; |
|||
}; |
|||
Weekday weekday(Year year, Month month, Day day) { |
|||
const char* what_day(const struct struct_date* date) |
|||
if (month < 3) { |
|||
{ |
|||
year -= 1u; |
|||
static const char* days[] = {"воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"}; |
|||
month += 10u; |
|||
int a = (14 - date->month) / 12; |
|||
} else |
|||
int y = date->year - a; |
|||
month -= 2u; |
|||
return (Weekday)((day + 31u * month / 12u + year + year / 4u - year / 100u + year / 400u) % 7u); |
|||
} |
} |
||
</source> |
</source> |
||
== |
==[[w:C_Sharp|C#]]== |
||
<source lang="csharp"> |
|||
Реализация на Delphi и FreePascal: |
|||
static byte Weekday(ushort year, byte month, byte day) { |
|||
if (month < 3u) { |
|||
year -= 1u; |
|||
month += 10u; |
|||
} else |
|||
month -= 2u; |
|||
return (byte)(((ushort)day + 31u * (ushort)month / 12u + year + year / 4u - year / 100u + year / 400u) % 7u); |
|||
} |
|||
</source> |
|||
==[[Delphi]], [[w:Паскаль (язык программирования)|Pascal]]== |
|||
<source lang="Pascal"> |
<source lang="Pascal"> |
||
type TYear = Word; |
|||
function WhatDay(Year: Integer; Month: Integer; Day: Integer):integer; |
|||
type TMonth = 1..12; |
|||
var a,y,m: integer; |
|||
type TDay = 1..31; |
|||
type TWeekday = 0..6; |
|||
function Weekday(year: TYear; month: TMonth; day: TDay): TWeekday; |
|||
begin |
begin |
||
if month < 3 then |
|||
a := (14 - Month) div 12; |
|||
begin |
|||
y := year - a; |
|||
month := month - 2; |
|||
year := year - 1 |
|||
WhatDay := (day + y + y div 4 - y div 100 + y div 400 + (31 * m) div 12) mod 7; |
|||
end |
|||
else |
|||
month := month + 10; |
|||
Weekday := (day + 31 * month div 12 + year + year div 4 - year div 100 + year div 400) mod 7 |
|||
end; |
end; |
||
</source> |
</source> |
||
==[[w:Go (язык программирования)|Go]]== |
|||
=== [[PHP]] === |
|||
<source lang="Go"> |
|||
Реализация на PHP: |
|||
type Year = uint16 |
|||
type Month = uint8 |
|||
type Day = uint8 |
|||
type Weekday = uint8 |
|||
func weekday(year Year, month Month, day Day) Weekday { |
|||
<source lang="PHP"> |
|||
if month < 3 { |
|||
function getDay($day, $mon, $year) |
|||
year -= 1 |
|||
{ |
|||
month += 10 |
|||
$days = array("воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "суббота"); |
|||
} else { |
|||
$day = (int)$day; //если день двухсимвольный и <10 |
|||
month -= 2 |
|||
$mon = (int)$mon; //если месяц двухсимвольный и <10 |
|||
} |
|||
$a = (int)((14 - $mon) / 12); |
|||
return Weekday((Year(day) + 31 * Year(month) / 12 + year + year / 4 - year / 100 + year / 400) % 7) |
|||
$y = $year - $a; |
|||
$m = $mon + 12 * $a - 2; |
|||
$d = ((int)($day+$y+ (int)($y/4) - (int)($y/100) + (int)($y/400) + (31*$m)/12))%7; |
|||
return $days[$d]; |
|||
} |
} |
||
</source> |
</source> |
||
== |
==[[Java]]== |
||
<source lang="java"> |
|||
Реализация в MS SQL: |
|||
static byte weekday(short year, byte month, byte day) { |
|||
if (month < 3) { |
|||
year -= 1; |
|||
month += 10; |
|||
} else |
|||
month -= 2; |
|||
return (byte)(((short)day + 31 * (short)month / 12 + year + year / 4 - year / 100 + year / 400) % 7); |
|||
} |
|||
</source> |
|||
==[[JavaScript]]== |
|||
<source lang="JavaScript"> |
|||
function weekday(year, month, day) { |
|||
year = parseInt(year, 10); |
|||
month = parseInt(month, 10); |
|||
day = parseInt(day, 10); |
|||
if (month < 3) { |
|||
year -= 1; |
|||
month += 10; |
|||
} else |
|||
month -= 2; |
|||
return (day + 31 * month / 12 + year + year / 4 - year / 100 + year / 400) % 7; |
|||
} |
|||
</source> |
|||
==[[Microsoft Excel]]== |
|||
А2 — ячейка, содержащая дату. |
|||
<source lang="html4strict"> |
|||
(English): =WEEKDAY(A2;2) |
|||
(Русский): =ДЕНЬНЕД(A2;2) |
|||
</source> |
|||
ЛИБО: |
|||
<source lang="html4strict"> |
|||
=ОКРВНИЗ(ОСТАТ((ДЕНЬ(A2)+(ГОД(A2)-ОКРВНИЗ((14-МЕСЯЦ(A2))/12;1))+ОКРВНИЗ((ГОД(A2)-ОКРВНИЗ((14-МЕСЯЦ(A2))/12;1))/4;1)-ОКРВНИЗ((ГОД(A2)-ОКРВНИЗ((14-МЕСЯЦ(A2))/12;1))/100;1)+ОКРВНИЗ((ГОД(A2)-ОКРВНИЗ((14-МЕСЯЦ(A2))/12;1))/400;1)+ОКРВНИЗ(31*(МЕСЯЦ(A2)+12*ОКРВНИЗ((14-МЕСЯЦ(A2))/12;1)-2)/12;1));7);1) |
|||
</source> |
|||
==[[w:MS SQL|MS SQL]]== |
|||
<source lang="mysql "> |
<source lang="mysql "> |
||
CREATE FUNCTION [dbo].[getDay]( |
CREATE FUNCTION [dbo].[getDay]( |
||
Строка 144: | Строка 222: | ||
</source> |
</source> |
||
== |
==[[PHP]]== |
||
<source lang="PHP"> |
|||
Реализация для командного процессора Windows (cmd.exe): |
|||
function weekday($year, $month, $day) { |
|||
$year = (int)year; |
|||
$month = (int)$month; |
|||
$day = (int)$day; |
|||
if (month < 3) { |
|||
$year -= 1; |
|||
$month += 10; |
|||
} else |
|||
$month -= 2; |
|||
return ($day + 31 * $month / 12 + $year + $year / 4 - $year / 100 + $year / 400) % 7; |
|||
} |
|||
</source> |
|||
==[[Python]]== |
|||
<source lang="python"> |
|||
def weekday(year: int, month: int, day: int) -> int: |
|||
if month < 3: |
|||
year -= 1 |
|||
month += 10 |
|||
else: |
|||
month -= 2 |
|||
return (day + 31 * month // 12 + year + year // 4 - year // 100 + year // 400) % 7 |
|||
</source> |
|||
==[[Ruby]]== |
|||
<source lang="ruby"> |
|||
def weekday(year, month, day) |
|||
if month < 3 |
|||
year -= 1 |
|||
month += 10 |
|||
else |
|||
month -= 2 |
|||
end |
|||
return (day + 31 * month / 12 + year + year / 4 - year / 100 + year / 400) % 7 |
|||
end |
|||
</source> |
|||
==[[w:Rust (язык программирования)|Rust]]== |
|||
<source lang="Rust"> |
|||
type Year = u16; |
|||
type Month = u8; |
|||
type Day = u8; |
|||
type Weekday = u8; |
|||
fn weekday(mut year: Year, mut month: Month, day: Day) -> Weekday { |
|||
if month < 3 { |
|||
year -= 1; |
|||
month += 10; |
|||
} else { |
|||
month -= 2; |
|||
} |
|||
((day as Year + 31 * month as Year / 12 + year + year / 4 - year / 100 + year / 400) % 7) as Weekday |
|||
} |
|||
</source> |
|||
==[[w:Cmd.exe|Командная строка Windows (cmd.exe)]]== |
|||
<source lang="C"> |
<source lang="C"> |
||
@echo off |
@echo off |
||
set /a день = %date:~0,2% |
|||
set /a месяц = %date:~3,2% |
|||
set /a год = %date:~6,4% |
set /a год = %date:~6,4% |
||
set /a месяц = %date:~3,2% |
|||
set /a число = %date:~0,2% |
|||
set /a a = ((14 - %месяц%) / 12) |
set /a a = ((14 - %месяц%) / 12) |
||
set /a y = (%год% - %a%) |
set /a y = (%год% - %a%) |
||
set /a m = (%месяц% + (12 * %a%) - 2) |
set /a m = (%месяц% + (12 * %a%) - 2) |
||
set /a ДеньНедели = (((% |
set /a ДеньНедели = (((%число% + %y% + (%y% / 4) - (%y% / 100) + (%y% / 400) + ((31 * %m%) / 12))) %% 7) |
||
echo %ДеньНедели% |
echo %ДеньНедели% |
||
</source> |
</source> |
||
==Программируемые микрокалькуляторы «Электроника»== |
|||
=== [[Python]] === |
|||
===МК-52 / 61 / 152 / 161 / 163 / 1152=== |
|||
Реализация на Python: |
|||
В вычислениях участвуют только регистры стека. |
|||
<source |
<source> |
||
00. ↔ 01. 3 02. − 03. 1 04. ↔ 05. Fx<0 06. 15 07. F🔃 08. ↔ 09. F🔃 |
|||
def what_day(day, month, year): |
|||
10. − 11. 1 12. 3 13. ↔ 14. F🔃 15. + 16. 3 17. 1 18. × 19. 1 |
|||
days = ["пн", "вт", "ср", "чт", "пт", "сб", "вс"] |
|||
20. 2 21. ÷ 22. К[x] 23. + 24. + 25. ↔ 26. 4 27. ÷ 28. К[x] 29. + |
|||
a = (14 - month) // 12 |
|||
30. ↔ 31. 2 32. F10ˣ 33. ÷ 34. ↔ 35. FВx 36. К[x] 37. − 38. ↔ 39. 4 |
|||
y = year - a |
|||
40. ÷ 41. К[x] 42. + 43. В↑ 44. В↑ 45. 7 46. ÷ 47. К[x] 48. 7 49. × |
|||
m = month + 12 * a - 2 |
|||
50. − 51. С/П |
|||
result = (((day + y + y // 4 - y // 100 + y // 400 + (31 * m) // 12)) % 7) - 1 |
|||
return days[result] |
|||
</source> |
|||
=== [[Microsoft Excel]] === |
|||
Реализация в MS Excel: |
|||
<source lang="html4strict"> |
|||
=ОКРВНИЗ(ОСТАТ((ДЕНЬ(A2)+(ГОД(A2)-ОКРВНИЗ((14-МЕСЯЦ(A2))/12;1))+ОКРВНИЗ((ГОД(A2)-ОКРВНИЗ((14-МЕСЯЦ(A2))/12;1))/4;1)-ОКРВНИЗ((ГОД(A2)-ОКРВНИЗ((14-МЕСЯЦ(A2))/12;1))/100;1)+ОКРВНИЗ((ГОД(A2)-ОКРВНИЗ((14-МЕСЯЦ(A2))/12;1))/400;1)+ОКРВНИЗ(31*(МЕСЯЦ(A2)+12*ОКРВНИЗ((14-МЕСЯЦ(A2))/12;1)-2)/12;1));7);1) |
|||
В ячейке А2 находится день календаря в формате даты. Результат выводится в виде номера дня недели(воскресение - 0) |
|||
ЛИБО: |
|||
(English): =CHOOSE(WEEKDAY(A2;2);"Monday";"Tuesday";"Wednesday";"Thursday";"Friday";"Saturday";"Sunday") |
|||
(Русский): =ВЫБОР(ДЕНЬНЕД(A2;2);"Понедельник";"Вторник";"Среда";"Четверг";"Пятница";"Суббота";"Воскресенье") |
|||
где А2 - это ваша ячейка с датой. |
|||
</source> |
|||
=== [[Ruby]] === |
|||
Реализация на Ruby: |
|||
<source lang="ruby"> |
|||
def week_day(year, month, day) |
|||
a = (14 - month) / 12 |
|||
y = year - a |
|||
m = month + 12 * a - 2 |
|||
(day + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12) % 7 |
|||
end |
|||
</source> |
|||
=== [[Java]] === |
|||
Реализация на Java: |
|||
<source lang="java"> |
|||
public static String weekday(int day, int month, int year){ |
|||
String days[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; |
|||
int a = (14 - month) / 12, y = year - a, m = month + 12 * a - 2; |
|||
return days[(day + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12) % 7]; |
|||
} |
|||
</source> |
</source> |
||
Использование: <год> В↑ <месяц> В↑ <число> В/О С/П (номер дня недели на индикаторе). |
|||
== |
==Ссылки== |
||
* [http://algolist.manual.ru/misc/yearweek.php Примеры программ для вычисления дня недели] |
* [http://algolist.manual.ru/misc/yearweek.php Примеры программ для вычисления дня недели] |
||
Версия от 23:56, 3 июля 2019
Описание
Существует довольно простой алгоритм вычисления дня недели для любой даты григорианского календаря, начиная с первого дня его действия — 15 октября 1583 года. (Предыдущим днём было 4 октября, числа с 5 по 14 октября включительно были пропущены для устранения 11‑дневного отставания от фактической даты, накопившегося за время использования юлианского календар).
Положим, дата задана так: год — год (от 1583), месяц — номер месяца (1…12), число — число месяца (1…31, согласно числу дней в соответствующем месяце), тогда:
a = (14 − месяц) / 12 y = год − a m = месяц + 12 * a − 2 ДеньНедели = (число + (31 * m) / 12 + y + y / 4 − y / 100 + y / 400) ОСТАТОК 7
либо, что почти то же самое:
если месяц = 1 или месяц = 2: // январь или февраль год = год − 1 месяц = месяц + 10 иначе: месяц = месяц − 2 всё ДеньНедели = (число + (31 * месяц) / 12 + год + год / 4 − год / 100 + год / 400) ОСТАТОК 7
Деление производится нацело (с отбрасыванием остатка).
Результат: 0 — воскресенье, 1 — понедельник и т. д.
Реализации
Arduino IDE
//==========================================================================================
//Глобальные переменные
//==========================================================================================
byte den = 7; //число
byte mes = 7; //месяц
unsigned int god = 2017; //год
//==========================================================================================
//Функция деления без остатка f_div
//==========================================================================================
unsigned int f_div(unsigned int x, unsigned int y){
unsigned int result;
result = (x-(x%y))/y;
return result;
}
//==========================================================================================
//Функция вычисления дня недели
//==========================================================================================
void nedelya(){
byte a = f_div((14-mes),12);
unsigned int y = god-a;
byte m = mes +12*a - 2;
unsigned int y4 = f_div(y,4);
byte y100 = f_div(y,100);
byte y400 = f_div(y,400);
byte x = f_div(31*m,12);
byte ned =(den + y + y4 - y100 + y400 + x)%7; //результат в переменной "ned"
}
//набирал с клавиатуры и убил вечер на тестирование - reodos
BASIC
GW-BASIC и совместимые диалекты
10 INPUT "Year", Y%: INPUT "Month", M%: INPUT "Day", D%
20 IF M% < 3 THEN Y% = Y% - 1: M% = M% + 10: ELSE M% = M% - 2
30 PRINT "Weekday: "; (D% + 31 * M% \ 12 + Y% + Y% \ 4 - Y% \ 100 + Y% \ 400) MOD 7
QuickBasic версий < 4.0, Turbo Basic
DEF FNWD%(Y%, M%, D%)
IF M% < 3 THEN
Y% = Y% - 1
M% = M% + 10
ELSE
M% = M% - 2
END IF
FNWD% = (D% + 31 * M% \ 12 + Y% + Y% \ 4 - Y% \ 100 + Y% \ 400) MOD 7
END DEF
PowerBASIC, QBASIC, QuickBasic версий ≥ 4.0, Visual Basic
Function Weekday (year As Integer, month As Integer, day As Integer) As Integer
If month < 3 Then
year = year - 1
month = month + 10
Else
month = month - 2
End If
Weekday = (day + 31 * month \ 12 + year + year \ 4 - year \ 100 + year \ 400) Mod 7 ' Для VB.NET следует заменить Weekday = на Return
End Function
C, C++
typedef unsigned short Year;
typedef unsigned char Month;
typedef unsigned char Day;
typedef unsigned char Weekday;
Weekday weekday(Year year, Month month, Day day) {
if (month < 3) {
year -= 1u;
month += 10u;
} else
month -= 2u;
return (Weekday)((day + 31u * month / 12u + year + year / 4u - year / 100u + year / 400u) % 7u);
}
C#
static byte Weekday(ushort year, byte month, byte day) {
if (month < 3u) {
year -= 1u;
month += 10u;
} else
month -= 2u;
return (byte)(((ushort)day + 31u * (ushort)month / 12u + year + year / 4u - year / 100u + year / 400u) % 7u);
}
Delphi, Pascal
type TYear = Word;
type TMonth = 1..12;
type TDay = 1..31;
type TWeekday = 0..6;
function Weekday(year: TYear; month: TMonth; day: TDay): TWeekday;
begin
if month < 3 then
begin
month := month - 2;
year := year - 1
end
else
month := month + 10;
Weekday := (day + 31 * month div 12 + year + year div 4 - year div 100 + year div 400) mod 7
end;
Go
type Year = uint16
type Month = uint8
type Day = uint8
type Weekday = uint8
func weekday(year Year, month Month, day Day) Weekday {
if month < 3 {
year -= 1
month += 10
} else {
month -= 2
}
return Weekday((Year(day) + 31 * Year(month) / 12 + year + year / 4 - year / 100 + year / 400) % 7)
}
Java
static byte weekday(short year, byte month, byte day) {
if (month < 3) {
year -= 1;
month += 10;
} else
month -= 2;
return (byte)(((short)day + 31 * (short)month / 12 + year + year / 4 - year / 100 + year / 400) % 7);
}
JavaScript
function weekday(year, month, day) {
year = parseInt(year, 10);
month = parseInt(month, 10);
day = parseInt(day, 10);
if (month < 3) {
year -= 1;
month += 10;
} else
month -= 2;
return (day + 31 * month / 12 + year + year / 4 - year / 100 + year / 400) % 7;
}
Microsoft Excel
А2 — ячейка, содержащая дату.
(English): =WEEKDAY(A2;2)
(Русский): =ДЕНЬНЕД(A2;2)
ЛИБО:
=ОКРВНИЗ(ОСТАТ((ДЕНЬ(A2)+(ГОД(A2)-ОКРВНИЗ((14-МЕСЯЦ(A2))/12;1))+ОКРВНИЗ((ГОД(A2)-ОКРВНИЗ((14-МЕСЯЦ(A2))/12;1))/4;1)-ОКРВНИЗ((ГОД(A2)-ОКРВНИЗ((14-МЕСЯЦ(A2))/12;1))/100;1)+ОКРВНИЗ((ГОД(A2)-ОКРВНИЗ((14-МЕСЯЦ(A2))/12;1))/400;1)+ОКРВНИЗ(31*(МЕСЯЦ(A2)+12*ОКРВНИЗ((14-МЕСЯЦ(A2))/12;1)-2)/12;1));7);1)
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 (DAY(@date) + @y + @y / 4 — @y / 100 + @y / 400 + (31 * @m) / 12) % 7
END
PHP
function weekday($year, $month, $day) {
$year = (int)year;
$month = (int)$month;
$day = (int)$day;
if (month < 3) {
$year -= 1;
$month += 10;
} else
$month -= 2;
return ($day + 31 * $month / 12 + $year + $year / 4 - $year / 100 + $year / 400) % 7;
}
Python
def weekday(year: int, month: int, day: int) -> int:
if month < 3:
year -= 1
month += 10
else:
month -= 2
return (day + 31 * month // 12 + year + year // 4 - year // 100 + year // 400) % 7
Ruby
def weekday(year, month, day)
if month < 3
year -= 1
month += 10
else
month -= 2
end
return (day + 31 * month / 12 + year + year / 4 - year / 100 + year / 400) % 7
end
Rust
type Year = u16;
type Month = u8;
type Day = u8;
type Weekday = u8;
fn weekday(mut year: Year, mut month: Month, day: Day) -> Weekday {
if month < 3 {
year -= 1;
month += 10;
} else {
month -= 2;
}
((day as Year + 31 * month as Year / 12 + year + year / 4 - year / 100 + year / 400) % 7) as Weekday
}
Командная строка Windows (cmd.exe)
@echo off
set /a год = %date:~6,4%
set /a месяц = %date:~3,2%
set /a число = %date:~0,2%
set /a a = ((14 - %месяц%) / 12)
set /a y = (%год% - %a%)
set /a m = (%месяц% + (12 * %a%) - 2)
set /a ДеньНедели = (((%число% + %y% + (%y% / 4) - (%y% / 100) + (%y% / 400) + ((31 * %m%) / 12))) %% 7)
echo %ДеньНедели%
Программируемые микрокалькуляторы «Электроника»
МК-52 / 61 / 152 / 161 / 163 / 1152
В вычислениях участвуют только регистры стека.
00. ↔ 01. 3 02. − 03. 1 04. ↔ 05. Fx<0 06. 15 07. F🔃 08. ↔ 09. F🔃
10. − 11. 1 12. 3 13. ↔ 14. F🔃 15. + 16. 3 17. 1 18. × 19. 1
20. 2 21. ÷ 22. К[x] 23. + 24. + 25. ↔ 26. 4 27. ÷ 28. К[x] 29. +
30. ↔ 31. 2 32. F10ˣ 33. ÷ 34. ↔ 35. FВx 36. К[x] 37. − 38. ↔ 39. 4
40. ÷ 41. К[x] 42. + 43. В↑ 44. В↑ 45. 7 46. ÷ 47. К[x] 48. 7 49. ×
50. − 51. С/П
Использование: <год> В↑ <месяц> В↑ <число> В/О С/П (номер дня недели на индикаторе).