Jump to content

Определение дня недели

(Перенаправлено из «Вычисление дня недели »)

Определение дня недели для любой даты может быть выполнено с помощью множества алгоритмов . Кроме того, вечные календари не требуют от пользователя вычислений и по сути представляют собой справочные таблицы. Типичное применение — вычисление дня недели , в который кто-то родился или произошло определенное событие.

Концепции

[ редактировать ]

При численном расчете дни недели представляются как номера дней недели. Если понедельник является первым днем ​​недели, дни могут быть закодированы от 1 до 7, с понедельника по воскресенье, как это практикуется в ISO 8601 . День, обозначенный цифрой 7, также можно посчитать за 0 , применив арифметику по модулю 7, которая вычисляет остаток числа после деления на 7. Таким образом, число 7 рассматривается как 0, число 8 — как 1, число 9 — как 0. как 2, число 18 как 4 и так далее. Если воскресенье считается днем ​​1, то 7 дней спустя ( т. е.   день 8) также является воскресеньем, а день 18 совпадает с днем ​​4, то есть средой, поскольку он приходится на три дня после воскресенья ( т. е.   18 по модулю 7 = 4). ). [а]

Стандартный Понедельник Вторник Среда Четверг Пятница Суббота Воскресенье Примеры использования
ИСО 8601 1 2 3 4 5 6 7 %_ISODOWI%, %@ISODOWI[]% ( 4DOS ); [1] ДЕНЬНЕДЕЛИ() ( HP Prime ) [2]
0 1 2 3 4 5 6
2 3 4 5 6 7 1 %NDAY OF WEEK% ( NetWare , DR-DOS [3] ); %_DOWI%, %@DOWI[]% ( 4DOS ) [1]
1 2 3 4 5 6 0 Финансовые калькуляторы HP

Базовый подход почти всех методов расчета дня недели начинается с «привязочной даты»: известной пары (например, 1 января 1800 года как среда), определяющей количество дней между известным днем ​​и днем ​​недели. день, который вы пытаетесь определить, и, используя арифметику по модулю 7, найдите новый числовой день недели.

Один стандартный подход состоит в том, чтобы найти (или вычислить, используя известное правило) значение первого дня недели данного столетия, найти (или вычислить, используя метод сравнения) поправку на месяц, вычислить количество високосных лет с начала века, а затем сложите их вместе с количеством лет с начала века и номером дня месяца. В конце концов, получается счетчик дней, к которому применяется модуль 7 для определения дня недели даты. [4]

Некоторые методы сначала выполняют все сложения, а затем отбрасывают семерки, тогда как другие отбрасывают их на каждом этапе, как в методе Льюиса Кэрролла . Любой из этих способов вполне жизнеспособен: первый проще для калькуляторов и компьютерных программ, второй для вычислений в уме (при некоторой практике вполне возможно выполнить все вычисления в голове). Ни один из приведенных здесь методов не выполняет проверку диапазона, поэтому необоснованные даты приведут к ошибочным результатам.

Соответствующие дни

[ редактировать ]

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

День
месяц
д
00 07 14 21 28 0
01 08 15 22 29 1
02 09 16 23 30 2
03 10 17 24 31 3
04 11 18 25 4
05 12 19 26 5
06 13 20 27 6

Соответствующие месяцы

[ редактировать ]

«Соответствующие месяцы» — это те месяцы календарного года, которые начинаются в один и тот же день недели. Например, сентябрь и декабрь совпадают, поскольку 1 сентября приходится на тот же день, что и 1 декабря (поскольку между этими двумя датами ровно тринадцать семидневных недель). Месяцы могут соответствовать только в том случае, если количество дней между их первыми днями делится на 7, или, другими словами, если их первые дни разделены целым числом недель. Например, февраль невисокосного года соответствует марту, потому что в феврале 28 дней, число, кратное 7, и 28 дней равны ровно четырем неделям. В високосном году январь и февраль соответствуют месяцам, отличным от обычного года, поскольку добавление 29 февраля означает, что каждый последующий месяц начинается на день позже.

Январь соответствует октябрю в високосные годы, а апрель и июль в високосные годы. Февраль соответствует марту и ноябрю в високосные годы и августу в високосные годы. Март всегда соответствует ноябрю, апрель всегда соответствует июлю, а сентябрь всегда соответствует декабрю. Август не соответствует никакому другому месяцу обычного года. Октябрь не соответствует никакому другому месяцу високосного года. Май и июнь никогда не соответствуют никакому другому месяцу.

В приведенной ниже таблице месяцев соответствующие месяцы имеют одинаковый номер, что следует непосредственно из определения.

Общие годы Високосные годы Все годы м
Ян октябрь 0
Может 1
февраль август 2
февраль март ноябрь 3
июнь 4
сентябрь декабрь 5
Ян апрель июль 6

Соответствующие годы

[ редактировать ]

Есть семь возможных дней, когда год может начаться, а високосные годы изменят день недели после 29 февраля. Это означает, что в году может быть 14 конфигураций. Все конфигурации могут обозначаться доминантной буквой , но поскольку 29 февраля не присвоена буква, високосный год имеет две доминантные буквы: одну для января и февраля, а другую (на один шаг назад в алфавитной последовательности) для марта и Декабрь.

2021 год — невисокосный год, начинающийся в пятницу, а это значит, что он соответствует 2010 календарному году. Первые два месяца 2021 года соответствуют первым двум месяцам 2016 года. 2022 год — невисокосный год, начинающийся в субботу, а это значит, что он соответствует 2011 календарному году. Последние десять месяцев 2022 года соответствуют последним десяти месяцам 2016 года. 2023 год — невисокосный год, начинающийся в воскресенье, а это значит, что он соответствует 2017 календарному году. 2024 год — високосный, начинающийся в понедельник, а это значит, что он соответствует 1996 календарному году. Первые два месяца 2024 года соответствуют первым двум месяцам 2018 года. Последние десять месяцев 2024 года соответствуют последним десяти месяцам 2019 года.

Каждый високосный год повторяется раз в 28 лет, а каждый високосный год повторяется раз в 6 лет и дважды в 11 лет. Например, последним високосным годом, начинающимся в среду, был 2020 год, а следующим будет 2048 год. Аналогично, следующими невисокосными годами, начинающимися в пятницу, будут 2027, 2038, а затем 2049. Оба эти утверждения верны, если только не високосный год пропускается, но это произойдет не раньше 2100 года.

Подробности смотрите в таблице ниже.

Год
век мод 28
и
00 06 12 17 23 0
01 07 12 18 24 1
02 08 13 19 24 2
03 08 14 20 25 3
04 09 15 20 26 4
04 10 16 21 27 5
05 11 16 22 00 6

Примечания:

  • Черный означает все месяцы високосного года.
  • Красный цвет означает первые два месяца високосного года.
  • Синий означает последние 10 месяцев високосного года.

Соответствующие века

[ редактировать ]
Юлианский век
около 700
Григорианский век
около 400 [б]
День
400: 1100 1800 ... 300: 1500 1900 ... Солнце
300: 1000 1700 ... Мой
200 0900 1600 ... 200: 1800 2200 ... Вт
100 0800 1500 ... Обвенчались
700: 1400 2100 ... 100: 1700 2100 ... Собирать [с]
600: 1300 2000 ... Пт
500: 1200 1900 ... 000: 1600 2000 ... Суббота

«000-й год» в обычной хронологии — это год 1 до н.э. (который предшествует 1 году нашей эры). В астрономической нумерации год год 0 находится между 1 г. до н. э. и 1 г. н. э. В пролептическом юлианском календаре (то есть юлианском календаре, каким он был бы, если бы он использовался правильно с самого начала), 1 г. до н. э. начинается в четверг. В пролептическом григорианском календаре (названном так потому, что он был разработан только в 1582 году) 1 год до нашей эры начинается в субботу.

Табличные методы расчета дня недели

[ редактировать ]

Полная таблица: Юлианский и Григорианский календари.

[ редактировать ]

Для юлианских дат до 1300 года и после 1999 года следует использовать год в таблице, отличающийся точно на 700 лет. Для дат по григорианскому календарю после 2299 года следует использовать год в таблице, который отличается точно на 400 лет. Значения от « r0 » до « r6 » обозначают остаток от деления значения «сотни» на 7 и 4 соответственно, указывая, как ряд простирается в любом направлении. Для удобства как юлианские, так и григорианские значения показаны в интервале 1500–1999 гг. Жирные цифры (например, 04 ) обозначают високосный год. Если год заканчивается цифрой 00, а его сотни выделены жирным шрифтом, то год високосный. Таким образом, 19 указывает, что 1900 год не является високосным по григорианскому календарю (но 19 в юлианском столбце указывает, что это юлианский високосный год, как и все юлианские годы x 00). 20 означает, что 2000 год — високосный. Используйте январь и февраль только в високосные годы.

Сотни лет Остальные цифры года Месяц
ДОУ
#
Джулиан
(р ÷ 7)
григорианский
(р ÷ 4)
р5 19 16 20 р0 00 06   17 23 28 34   45 51 56 62   73 79 84 90 Ян октябрь на 0
р4 18 15 19 р3 01 07 12 18 29 35 40 46 57 63 68 74 85 91 96 Может Они есть 1
р3 17 02   13 19 24 30   41 47 52 58   69 75 80 86   97 февраль август М 2
р2 16 18 22 р2 03 08 14   25 31 36 42   53 59 64 70   81 87 92 98 февраль Мар ноябрь Вт 3
р1 15   09 15 20 26   37 43 48 54   65 71 76 82   93 99 июнь В 4
р0 14 17 21 р1 04 10   21 27 32 38   49 55 60 66   77 83 88 94 Сентябрь декабрь че 5
р6 13 05 11 16 22 33 39 44 50 61 67 72 78 89 95 Ян апрель июль Ф 6

Для определения дня недели (1 января 2000 г., суббота)

  • день месяца: 1 ~ 31 (1)
  • месяц: (6)
  • год: (0)
  • век mod 4 для григорианского календаря и mod 7 для юлианского календаря (0) .
  • прибавляя 1+6+0+0=7. В результате деления на 7 в остатке будет 0, следовательно, день недели — суббота.

Формула: w = (d + m + y + c) mod 7.

Пересмотренный юлианский календарь

[ редактировать ]

Обратите внимание, что дата (и, следовательно, день недели) в пересмотренном юлианском и григорианском календарях одинакова с 14 октября 1923 года по 28 февраля 2800 года нашей эры включительно, и что для больших лет можно вычесть 6300 или кратное им число, прежде чем начиная с того, чтобы достичь года, который находится в пределах таблицы или ближе к ней.

Чтобы найти день недели любой даты для любого года с помощью таблицы, вычтите 100 из года, разделите разницу на 100, умножьте полученное частное (без дробей) на семь и разделите результат на девять. Обратите внимание на частное (опуская дроби). Введите в таблицу юлианский год и непосредственно перед последним делением прибавьте 50 и вычтите указанное выше частное.

Пример: Какой день недели 27 января 8315 года?

8315–6300=2015, 2015–100=1915, 1915/100=19, остаток 15, 19×7=133, 133/9=14, остаток 7. 2015 год на 700 лет опережает 1315, поэтому используется 1315. Из таблицы: для сотен (13): 6. Для остальных цифр (15): 4. Для месяца (январь): 0. Для даты (27): 27. 6 + 4 + 0 + 27 + 50 − 14 = 73 . 73/7=10 остаток 3. День недели = вторник.

Доминиальное письмо

[ редактировать ]

Чтобы найти доминиальную букву , вычислите день недели: 1 января или 1 октября. Если сегодня воскресенье, то доминиальная буква — А, если суббота — Б, и аналогичным образом в обратном направлении через неделю и вперед по алфавиту до понедельника, то есть G.

Високосные годы имеют две буквы воскресенья, поэтому для января и февраля рассчитайте день недели на 1 января, а с марта по декабрь — на 1 октября.

Високосными считаются все годы, которые делятся ровно на четыре, за следующими исключениями:

В григорианском календаре – все годы, которые делятся ровно на 100 (кроме тех, которые делятся ровно на 400).

В пересмотренном юлианском календаре - все годы, которые делятся ровно на 100 (кроме тех, которые дают остаток 200 или 600 при делении на 900).

«Судный день»

[ редактировать ]

Это артефакт развлекательной математики. См. «Правиле Судного Дня» объяснение в .

Проверьте результат

[ редактировать ]

Используйте эту таблицу для определения дня недели без каких-либо вычислений.

Индекс Мой
А
Вт
Б
Обвенчались
С
Собирать
Д
Пт
И
Суббота
Ф
Солнце
Г
Вечный григорианский и юлианский календарь.
Используйте январь и февраль для високосных лет.
Буква даты в строке года для буквы в строке столетия

Все дни C — это конец света

Джулиан
век
григорианский
век
Дата 01
08
15
22
29
02
09
16
23
30
03
10
17
24
31
04
11
18
25

05
12
19
26

06
13
20
27

07
14
21
28

12 19 16 20 апрель июль Ян Г А Б С Д И Ф 01 07 12 18 29 35 40 46 57 63 68 74 85 91 96
13 20 Сентябрь декабрь Ф Г А Б С Д И 02 13 19 24 30 41 47 52 58 69 75 80 86 97
14 21 17 21 июнь И Ф Г А Б С Д 03 08 14 25 31 36 42 53 59 64 70 81 87 92 98
15 22 февраль Мар ноябрь Д И Ф Г А Б С 09 15 20 26 37 43 48 54 65 71 76 82 93 99
16 23 18 22 август февраль С Д И Ф Г А Б 04 10 21 27 32 38 49 55 60 66 77 83 88 94
17 24 Может Б С Д И Ф Г А 05 11 16 22 33 39 44 50 61 67 72 78 89 95
18 25 19 23 Ян октябрь А Б С Д И Ф Г 06 17 23 28 34 45 51 56 62 73 79 84 90 0 0
[Год/100] григорианский
век
20
16
21
17
22
18
23
19
Год мод 100
Джулиан
век
19
12
20
13
21
14
22
15
23
16
24
17
25
18

Примеры:

  • Для общего метода
26 декабря 1893 г. (ГД)

Декабрь находится в строке F , а 26 — в столбце E , поэтому буква даты — C, расположенная в строке и столбце E. F 93 (год по модулю 100) находится в строке D а буква C в строке года находится в столбце G. (строка года) , 18 ([год/100] в столбце столетий по григорианскому календарю) находится в строке C (строка века), а буква в строке века и столбце G — это B, поэтому день недели — вторник.

13 октября 1307 г. (JD)

13 октября — день F. находится в столбце G. Буква F в строке года (07 ) Буква в строке столетия (13) и столбце G — это E, поэтому день недели — пятница.

1 января 2000 г. (ГД)

1 января соответствует G, G в строке года ( 0 0) соответствует F в строке столетия ( 20 ), а F соответствует субботе.

Содержательная формула для метода: «Буква даты (G), буква (G) находится в строке года ( 0 0), для буквы (F) в строке века ( 20 ), а для дня буква (F) становится будний день (суббота)» .

Метод воскресного письма

Каждому дню года (кроме 29 февраля) присвоена буква в повторяющейся последовательности ABCDEFG. Серия начинается с А 1 января и продолжается снова до А 31 декабря. Воскресное письмо — это письмо, которое противостоит всем воскресеньям в году. Поскольку 29 февраля не имеет буквы, это означает, что воскресное письмо с марта по декабрь является шагом назад в последовательности по сравнению с письмом за январь и февраль. Буква для любой даты будет найдена там, где строка, содержащая месяц (черный цвет) слева от «латинского квадрата», встречается со столбцом, содержащим дату над «латинским квадратом». Воскресное письмо можно найти там, где столбец, содержащий век (под «латинским квадратом»), встречается со строкой, содержащей две последние цифры года, справа от «латинского квадрата». Для високосного года найденная таким образом воскресная буква относится к периоду с марта по декабрь.

Так, например, чтобы найти день недели 16 июня 2020 года:

Столбец «20» соответствует строке «20» в точке «D». Строка «Июнь» встречается со столбцом «16» в позиции «F». Поскольку F состоит из двух букв после D, то день недели начинается через два дня после воскресенья, то есть вторника.

Математические алгоритмы

[ редактировать ]

Крысиная смерть

[ редактировать ]

Метод Rata Die работает путем сложения количества дней d прошедших с даты известного дня недели D. , День недели затем задается как ( D + d ) mod 7 которое использовалось для кодирования D. , что соответствует любому соглашению ,

Например, дата 13 августа 2009 года составляет 733632 дня от 1 января 1 года нашей эры. Взяв число по модулю 7, получим 4, следовательно, четверг.

Алгоритм Гаусса

[ редактировать ]

Карл Фридрих Гаусс описал метод расчета дня недели на 1 января любого года в рукописной заметке в сборнике астрономических таблиц. [5] Он никогда не публиковал это. Наконец, в 1927 году оно было включено в его собрание сочинений. [6] По сравнению с Rata Die результат помогает упростить подсчет лет.

Метод Гаусса был применим к григорианскому календарю. Он пронумеровал дни недели от 0 до 6, начиная с воскресенья. Он определил следующую операцию.

Входы
Номер года A , номер месяца M , номер даты D .
Выход
День года.
Процедура
  1. Сначала определите день недели d 1 1 января.
    • В григорианском календаре днем ​​недели является [5]
           (1 + 5(( A −1) % 4) + 4(( A −1) % 100) + 6(( A −1) % 400)) % 7. Альтернативно положим C = A \ 100 , Y = A % 100 и значение
           (1 + 5(( Y −1)%4) + 3( Y −1) + 5(C%4)) % 7.
    • В юлианском календаре днем ​​недели является
           (6 + 5(( A −1)%4) + 3( A −1)) % 7 или
           (6 + 5(( Y −1) % 4) + 3( Y −1) + 6C) % 7 .
  2. связанное с месяцем Теперь определите смещение m, , используя таблицу поиска с M .
  3. Возврат d = ( d 1 + m + D ) % 7 .
Таблица смещений месяцев
Месяцы Ян февраль Мар апрель Может июнь июль август Сентябрь октябрь ноябрь декабрь
Общие годы 0 3 3 6 1 4 6 2 5 0 3 5
Високосные годы 4 0 2 5 0 3 6 1 4 6

Описанную выше процедуру можно свести к одному выражению для григорианского случая:
     (D + m + 5(( A −1)%4) + 4(( A −1)%100) + 6(( A −1)%400))%7

Рабочий пример

[ редактировать ]

Для года номер 2000, A − 1 = 1999 , Y − 1 = 99 и C = 19 , день недели 1 января будет

= (1 + 5(1999%4) + 4(1999%100) + 6(1999%400))%7
= (1 + 1 + 4 + 0) % 7
= 6
= (1 + 5(99%4) + 3 × 99 + 5(19%4))%7
= (1 + 1 + 3 + 1)%7
= 6 = Суббота.

Будние дни 30 апреля 1777 г. и 23 февраля 1855 г .:

= (30 + 6 + 5(1776%4) + 4(1776%100) + 6(1776%400))%7
= (2 + 6 + 0 + 3 + 6)%7
= 3 = среда

и

= (6 + 23 + ⌈2.6 × 12⌉ + 5(1854%4) + 4(1854%100) + 6(1854%400))%7
= (6 + 2 + 4 + 3 + 6 + 5)%7
= 5 = Пятница.

Пояснения и примечания

[ редактировать ]

Алгоритм для дня недели 1 января можно доказать с помощью арифметики по модулю. Суть в том, что, поскольку 365 % 7 = 1 , каждый год добавляет к прогрессии 1 день. Остальное — корректировка на високосный год. Версии, основанные на столетии, имеют 36525 % 7 = 6 .

Таблица смещений месяцев показывает расхождение в феврале из-за високосного года. Распространенный метод (позже использованный Целлером) заключается в переносе месяца на март, чтобы високосный день находился в конце отсчета. Кроме того, как позже показал Целлер, таблицу можно заменить арифметическим выражением.

Эта формула была также преобразована Крайчиком и Швердтфегером в графический и табличный методы расчета любого дня недели. [6] [7]

Разные вариации

[ редактировать ]

Следующая формула является примером версии без таблицы поиска. Предполагается, что год начинается в марте, а это означает, что даты в январе и феврале следует рассматривать как часть предыдущего года. Формула григорианского календаря: [8]

где

  • d — день месяца (от 1 до 31)
  • m — смещённый месяц (март = 1,…,февраль = 12)
  • Y — год, если m не равно 11 = январю или 12 = февралю, которые считаются частью предыдущего года, что дает Y = год — 1.
  • c — век, заданный
  • y — год относительно столетия, определяемый формулой или просто последние 2 цифры Y
  • w — день недели (0 = воскресенье,…,6 = суббота)
Таблица смещений месяцев ( )
Месяцы Мар апрель Может июнь июль август Сентябрь октябрь ноябрь декабрь Ян февраль
Компенсировать 2 5 7 10 12 15 18 20 23 25 28 31

Алгоритм Целлера

[ редактировать ]

В алгоритме Целлера месяцы нумеруются от 3 (март) до 14 (февраль). Предполагается, что год начнется в марте; это означает, например, что январь 1995 года следует рассматривать как 13-й месяц 1994 года. [9] Формула григорианского календаря:
где

  • день месяца (от 1 до 31)
  • смещаемый месяц (март=3,...январь = 13, февраль=14)
  • это год, если только 13 = январь или 14 = февраль, которые считаются частью предыдущего года, что дает
  • век, заданный
  • год относительно столетия, заданный формулой или просто последние 2 цифры
  • день недели (1 = воскресенье,..0 = суббота)
Таблица смещений месяцев ( )
Месяцы Мар апрель Может июнь июль август Сентябрь октябрь ноябрь декабрь Ян февраль
Компенсировать 10 13 15 18 20 23 26 28 31 33 36 39


Единственное различие заключается в одном между алгоритмом Целлера ( Z ) и алгоритмом Диспаратного Гаусса ( G ), то есть Z G = 1 = Sunday .

(Март = 3 в Z , но март = 1 в G )

Алгоритм Ванга

[ редактировать ]

Алгоритм Ванга [10] для человеческого расчета григорианского календаря (из формулы следует вычесть 1, если m равно 1 или 2, если год високосный)
где

  • — последняя цифра года ( единиц)
  • — предпоследняя цифра года ( десятки )
  • — век, заданный формулой
  • — день месяца (от 1 до 31)
  • — месяц (январь=1,…,декабрь=12)
  • — день недели (0=воскресенье,…,6=суббота)
  • — это функция нулевых дней (смещение месяца) со значениями, указанными в следующей таблице.
м
1 1 День
3 5 м + 2
5 7
7 9
9 3 м + 1
11 12
2 12 м + 3
4 2 м - 2
6 4
8 6
10 8
12 10

Алгоритм для юлианского календаря можно получить из приведенного выше алгоритма. где ⁠ — это конец света.

м
1 3 день С
3 7 м + 4
5 9
7 11
9 5 м − 4
11 7
2 0 м - 2
4 4 м
6 6
8 8
10 10
12 12

Другие алгоритмы

[ редактировать ]

метод Швердтфегера

[ редактировать ]

В частично табличном методе Швердтфегера год делится на столетие и двузначный год внутри столетия. Подход зависит от месяца. Для m ≥ 3 ,

поэтому g находится в диапазоне от 0 до 99. Для m = 1,2

Формула дня недели: [6]

где выбран положительный модуль. [6]

Значение e получено из следующей таблицы:

м 1 2 3 4 5 6 7 8 9 10 11 12
и 0 3 2 5 0 3 5 1 4 6 2 4

Значение f получается из следующей таблицы и зависит от календаря. Для григорианского календаря [6]

с против 4 0 1 2 3
ж 0 5 3 1

Для юлианского календаря [6]

с против 7 0 1 2 3 4 5 6
ж 5 4 3 2 1 0 6

Метод Льюиса Кэрролла

[ редактировать ]

Чарльз Лютвидж Доджсон ( Льюис Кэрролл ) разработал метод, напоминающий головоломку, но частично табличный, используя те же порядковые номера месяцев, что и в «Полной таблице: юлианский и григорианский календари» выше. Он перечисляет те же три поправки для первых трех месяцев невисокосных лет, одну на 7 выше для последнего и дает загадочные инструкции по нахождению остальных; его поправки на столетия должны определяться с использованием формул, аналогичных формулам для таблицы столетий. Хотя он явно утверждает, что его метод также работает для дат по старому стилю , его пример, воспроизведенный ниже, показывает, что «1676, 23 февраля» — это среда, работает только по юлианскому календарю, который начинается с 1 января, а не с 25 марта, как в юлианском календаре. «старый стиль» юлианского календаря .

Алгоритм: [11]

Разбейте данную дату на 4 части, т.е. количество столетий, количество прошедших лет, месяц, день месяца.

Вычислите следующие 4 элемента, добавляя каждый из них, когда он будет найден, к сумме предыдущих элементов. Если элемент или сумма превышает 7, разделите на 7 и сохраните только остаток.

Столетие: для « Старого стиля » (который закончился 2 сентября 1752 г.) вычтите из 18. Для « Нового стиля » (который начался 14 сентября 1752 г.) разделите на 4, отнимите избыток [излишек] от 3, умножьте остаток на 2.

Элемент года: сложите количество десятков, плюс и количество четверок в плюсе.

Элемент месяца: если он начинается или заканчивается гласной, вычтите число, обозначающее его место в году, из 10. Это, плюс количество дней, дает элемент следующего месяца. Позиция за январь — «0»; для февраля или марта — «3»; за декабрь, «12».

Элемент дня: Достигнутую таким образом сумму необходимо исправить путем вычитания «1» (сначала прибавив 7, если сумма равна «0»), если дата — январь или февраль високосного года, помня, что каждый год делящийся на 4, является високосным годом, за исключением только столетий в «новом стиле», когда число столетий не делится так сильно (например, 1800).

Окончательный результат дает день недели: «0» означает воскресенье, «1» — понедельник и т. д.

Примеры: [11]

1783, 18 сентября

17, разделенное на 4, оставляет цифру «1»; 1 из 3 дает «2»; дважды 2 — это «4». 83 — это 6 дюжин и 11, что дает 17; плюс 2 дает 19, т.е. (деление на 7) «5». Всего 9, т.е. «2» Позиция за август — «8 из 10», т.е. «2»; итак, для сентября это "2 плюс 31", т.е. "5". Итого 7, т.е. "0", что и выходит. 18 дает «4». Ответ: «Четверг».

1676, 23 февраля

16 из 18 дает «2» 76 — это 6 дюжин и 4, что дает 10; плюс 1 дает 11, т.е. «4». Всего «6» Товар за февраль — «3». Всего 9, т.е. «2» 23 дает «2». Итого «4» Поправка на високосный год дает «3». Ответ: «Среда».

Даты до 1752 года в Англии будут обозначаться по старому стилю , причем 25 марта будет первым днем ​​нового года . Однако метод Кэрролла предполагает 1 января как первый день года, поэтому ему не удается прийти к правильному ответу, а именно «пятница».

Если бы он заметил, что 1676 год, 23 февраля (с 25 марта как день Нового года), на самом деле является 1677 годом, 23 февраля (с 1 января как день Нового года), он бы учел разные числа лет - точно так же, как Джорджа Вашингтона. отличается день рождения — между двумя календарями. Тогда его метод дает:

1677 г. (исправлено), 23 февраля.

16 из 18 дает «2», 77 — 6 дюжин и 5 — 11; плюс 1 дает 12, т.е. «5». Итого «7». Показатель за февраль — «3». Итого 10, т.е. «3» 23 дает «2». Итого «5». Ответ: «Пятница».

Примечательно, что те, кто переиздавал метод Кэрролла, не смогли указать на его ошибку, в первую очередь Мартин Гарднер . [12]

В 1752 году Британская империя отказалась от использования старого стиля юлианского календаря , приняв григорианский календарь , который стал сегодня стандартом в большинстве стран мира. Дополнительную информацию см. в статьях «Даты по старому стилю» и «Новому стилю» .

Методы в компьютерном коде

[ редактировать ]

В выражениях языка C ниже: y, m и d являются, соответственно, целочисленными переменными, представляющими год (например, 1988), месяц (1–12) и день месяца (1–31).

(d+=m<3 ? y-- : y-2,23*m/9+d+4+y/4-y/100+y/400) % 7

В 1990 году Майкл Кейт и Том Крейвер опубликовали приведенное выше выражение, целью которого является минимизировать количество нажатий клавиш, необходимых для ввода автономной функции преобразования даты по григорианскому календарю в числовой день недели. [13] Он возвращает 0 = воскресенье, 1 = понедельник и т. д. В этом выражении используется менее громоздкий компонент месяца, чем в алгоритме Целлера.

Вскоре после этого Ханс Лахман оптимизировал свой алгоритм для удобства использования на устройствах начального уровня. Первоначально разработанный для калькуляторов с четырьмя функциями, его метод требует меньшего количества операций ввода с клавиатуры, поскольку его диапазон ограничивается либо 1905–2099 годами нашей эры, либо историческими датами по юлианскому календарю. Позже он был модифицирован для преобразования любой даты по григорианскому календарю, даже на счетах . В устройствах на базе Motorola 68000 также меньше необходимости в регистрах процессора или кодах операций , в зависимости от предполагаемой цели проектирования. [14]

Методы Сакамото

[ редактировать ]

Табличный предшественник алгоритма Тондеринга воплощен в следующей K&R C. функции [15] С небольшими изменениями он был адаптирован для других языков программирования высокого уровня, таких как APL2 . [16] Опубликовано Томохико Сакамото в группе новостей Usenet comp.lang.c в 1992 году, оно точно соответствует любой григорианской дате. [17] [18]

dayofweek(y, m, d)	/* 1 <= m <= 12,  y > 1752 (in the U.K.) */
{
    static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
    if ( m < 3 )
    {
        y -= 1;
    }
    return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}

Он возвращает 0 = воскресенье, 1 = понедельник и т. д.

Одновременно Сакамото опубликовал и более запутанную версию:

dow(m,d,y) { y -= m<3; return (y+y/4-y/100+y/400+"-bed=pen+mad."[m]+d) % 7; }

В этой версии в строке кодируются смещения месяцев, поэтому требуется компьютер, использующий стандарт ASCII для правильного выполнения алгоритма , что снижает его переносимость . Кроме того, в обоих алгоритмах отсутствует int объявления типов , что разрешено в оригинальном K&R C , но не разрешено в ANSI C.

(Алгоритм Тондеринга снова аналогичен по структуре конгруэнтности Целлера и короткому коду Кита, за исключением того, что компонент, связанный с месяцем, 31*m/12. Сакамото находится где-то между алгоритмом Диспаратного Гаусса и алгоритмом Швердтфегера, очевидно, не зная о форме выражения.)

Метод Гаусса в MATLAB

[ редактировать ]
% example date input
y1 = 2022;
m1 = 1;
d1 = 1;

month_offset = [0 3 3 6 1 4 6 2 5 0 3 5]; % common year

% offset if y1 leap year
if mod(y1,4)==0 && mod(y1,100)==0 && mod(y1,400)==0
   month_offset=[0 3 4 0 2 5 0 3 6 1 4 6]; % leap year
end

% Gregor
weekday_gregor = rem( d1+month_offset(m1) + 5*rem(y1-1,4) + 4*rem(y1-1,100) + 6*rem(y1-1,400),7)

% Julian
weekday_julian = rem(6+5*rem(y1-1,4) + 3*(y1-1),7)

0: воскресенье 1: понедельник .. 6: суббота

См. также

[ редактировать ]

Примечания

[ редактировать ]
  1. ^ Чтобы проиллюстрировать это подробно, полезно визуализировать календарь, изображающий месяц, начинающийся в воскресенье, т.е.   1-е число месяца приходится на воскресенье). Отсчет семи дней вперед приводит нас к 8-му числу, которое также является воскресеньем. Отсчитав еще десять дней вперед, мы приходим к 18-му числу, то есть среде. Если бы вместо этого мы начали в среду 4-го числа (через три дня после воскресенья 1-го), отсчитали семь дней вперед до среды 11-го (три дня после воскресенья 8-го), а затем отсчитали еще семь дней вперед, мы бы оказались в среду 1-го числа. 18-е снова через три дня после воскресенья 15-го, что само приходится ровно через две недели (два воскресенья) после воскресенья 1-го.
  2. ^ Цифры в первом столбце являются предупредительными — григорианский календарь был разработан только в 1582 году. См. примечание под таблицей.
  3. ^ Юлианский век, начинающийся с 1 г. до н. э., также может появиться в этой строке таблицы (слева от 700 г.), но для его включения нет места.
  1. ^ Перейти обратно: а б Братья Хардин; Роусон, Том ; Конн, Рекс К .; Пол, Матиас Р.; Дай, Чарльз Э.; Георгиев, Лучезар И. (27 февраля 2002 г.). Онлайн-справка по 4DOS 8.00 .
  2. ^ «HP Prime — Портал: Обновление встроенного ПО» (на немецком языке). Моравское образование. 15 мая 2015 г. Архивировано из оригинала 5 ноября 2016 г. Проверено 28 августа 2015 г.
  3. ^ Пол, Матиас Р. (30 июля 1997 г.). NWDOS-TIPs — Советы и рекомендации по Novell DOS 7 с учетом недокументированных подробностей, ошибок и обходных путей . Выпуск 157 (на немецком языке) (3-е изд.). Архивировано из оригинала 4 ноября 2016 г. Проверено 6 августа 2014 г. (Примечание. NWDOSTIP.TXT представляет собой исчерпывающую работу по Novell DOS 7 и OpenDOS 7.01 , включая описание многих недокументированных функций и внутренних устройств. Это часть еще более обширной работы автора. MPDOSTIP.ZIP Коллекция сохранялась до 2001 года и в то время распространялась на многих сайтах. Предоставленная ссылка указывает на более старую версию файла, преобразованную в HTML. NWDOSTIP.TXT файл.)
  4. ^ Ричардс, Э.Г. (1999). Картирование времени: календарь и его история . Издательство Оксфордского университета . ISBN  978-0-19-850413-9 .
  5. ^ Перейти обратно: а б Гаусс, Карл Ф. (1981). «Нахождение дня недели 1 января года. Число Гельдена. Эпакте. Пасхальная граница.». Фабрики. опубликовано Королевским обществом наук в Геттингене (2-е изд.). Хильдесхайм: Георг Олмс Верлаг. стр. 206–207. ISBN  978-3-48704643-3 .
  6. ^ Перейти обратно: а б с д и ж Швердтфегер, Берндт Э. (7 мая 2010 г.). «Календарная формула Гаусса для дня недели» (PDF) (изд. 1.4.26) . Проверено 23 декабря 2012 г.
  7. ^ Крайчик, Морис (1942). «Глава 5: Календарь». Математические развлечения (2-е исправленное [Дувр] изд.). Минеола: Dover Publications . стр. 109–116. ISBN  978-0-48645358-3 .
  8. ^ Розен, Кеннет Х. (2011). Элементарная теория чисел и ее приложения . Эддисон Уэсли. стр. 134–137. ISBN  978-0321500311 .
  9. ^ Стоктон, младший (19 марта 2010 г.). «Календарные труды ректора Х. Целлера: день недели и формулы Пасхи» . Мерлин . Архивировано из оригинала 29 июля 2013 г. Проверено 19 декабря 2012 г.
  10. ^ Ван, Сян-Шэн (март 2015 г.). «Вычисление дня недели: алгоритм нулевых дней» (PDF) . Журнал развлекательной математики . № 3. с. 5.
  11. ^ Перейти обратно: а б Доджсон, CL ( Льюис Кэрролл ). (1887). «Чтобы найти день недели для любой даты». Nature , 31 марта 1887 г. Перепечатано в Mapping Time , стр. 299–301.
  12. ^ Мартин Гарднер. (1996). Вселенная в носовом платке: математические развлечения, игры, головоломки и игры слов Льюиса Кэрролла , страницы 24–26. Спрингер-Верлаг.
  13. ^ Майкл Кейт; Том Крейвер. (1990). Самый лучший вечный календарь? Журнал развлекательной математики, 22:4, стр. 280-282.
  14. ^ Калькулятор с 4 функциями; Ассамблея Motorola 68000 сирот; Абакус. суслик://sdf.org/1/users/retroburrowers/TemporalRetrology
  15. ^ «НУЖЕН алгоритм дня недели!» новости: [адрес электронной почты защищен]
  16. ^ Рабочая область APL2 IDIOMS: Алгоритмы даты и времени, строка 15. ftp://ftp.software.ibm.com/ps/products/apl2/info/APL2IDIOMS.pdf [ постоянная мертвая ссылка ] (2002)
  17. ^ «Преобразование даты -> дня недели» . Группы новостей Google:comp.lang.c . Декабрь 1992 года . Проверено 21 июня 2020 г.
  18. ^ «Алгоритм ДОУ» . Группы новостей Google:comp.lang.c . 1994 . Проверено 21 июня 2020 г.

Дальнейшее чтение

[ редактировать ]
  • Хейл-Эванс, Рон (2006). «Совет № 43: Рассчитайте любой день недели» . Хаки для умственной деятельности (1-е изд.). Пекин: О'Рейли. стр. 164–169 . ISBN  9780596101534 .
  • Тиу, Марк; Старк, Дэвид Э.; Клейман, Шерил; Шульц, Роберт Т. (2006). «День недели, когда вы родились через 700 мс: расчет календаря у ученого-аутиста». Журнал экспериментальной психологии: человеческое восприятие и деятельность . 32 (5): 1155–1168. дои : 10.1037/0096-1523.32.5.1155 . ПМИД   17002528 .
  • Трефферт, Дарольд А. (12 октября 2011 г.). «Зачем рассчитывать календарь?». Острова гениальности: богатый ум аутиста, приобретенного и неожиданного ученого (1. опубл., [повтор.]. Ред.). Лондон: Джессика Кингсли. стр. 63–66. ISBN  9781849058735 .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 2a355cd74889decd94a8748e46325ed7__1718579460
URL1:https://arc.ask3.ru/arc/aa/2a/d7/2a355cd74889decd94a8748e46325ed7.html
Заголовок, (Title) документа по адресу, URL1:
Determination of the day of the week - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)