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

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

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

Содержание
  • 1 Концепции
    • 1.1 Соответствующие дни
    • 1.2 Соответствующие месяцы
    • 1.3 Соответствующие годы
    • 1.4 Соответствующие столетия
  • 2 Табличные методы для вычисления дня недели
    • 2.1 Полная таблица: юлианский и григорианский календари
    • 2.2 Пересмотренный юлианский календарь
    • 2.3 Доминирование
    • 2.4 «Судный день»
    • 2.5 Проверка результата
  • 3 Математические алгоритмы
    • 3.1 Алгоритм Гаусса
      • 3.1.1 Несопоставимые вариации
    • 3.2 Алгоритм Целлера
    • 3.3 Алгоритм Ванга
  • 4 Другие алгоритмы
    • 4.1 Метод Швердтфегера
    • 4.2 Метод Льюиса Кэрролла
    • 4.3 Методы, зависящие от реализации
      • 4.3.1 Методы Сакамото
      • 4.3.2 Rata Die
  • 5 См. Также
  • 6 Ссылки
  • 7 Внешние ссылки
Концепции

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

СтандартПонедельникВторникСредаЧетвергПятницаСубботаВоскресеньеПримеры использования
ISO 8601 1234567% _ISODOWI%,% @ ISODOWI% (4DOS ); DAYOFWEEK () (HP Prime )
0123456
2345671% NDAY OF WEEK% (NetWare, DR-DOS );% _DOWI%,% @ DOWI% (4DOS )
1234560Финансовые калькуляторы HP

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

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

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

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

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

День. месяцаd
00 07 14 21 280
01 08 15 22 291
02 09 16 23 302
03 10 17 24 313
04 11 18 254
05 12 19 265
06 13 20 276

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

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

Соответствующие месяцы показаны ниже.

Обычные годы

  • январь и октябрь.
  • февраль, март и ноябрь.
  • апрель и июль.
  • Августу не соответствует ни один месяц.

Прыжок годы

  • январь, апрель и июль.
  • февраль и август.
  • март и ноябрь.
  • Октябрь не соответствует ни одному месяцу.

Все годы

  • Сентябрь и декабрь.
  • Ни один месяц не соответствует маю или июню.

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

Обычные годыВисокосные годыm
Янв ОктябрьОктябрь0
Май1
АвгФев Август2
Фев Мар Ноябрьмар ноя3
июн4
сентябрь декабрь5
апрель июльянв апр июль6

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

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

Например, 2019 был обычным годом, начинающимся во вторник, что означает, что год в целом соответствовал 2013 календарному году. С другой стороны, 2020 год - это високосный год, начинающийся в среду, который в целом будет соответствовать календарному году 1992 года; в частности, его первые 2 месяца, за исключением 29 февраля, будут соответствовать месяцам 2014 календарного года, а из-за високосного дня 2020 года его последующие 10 месяцев будут соответствовать 2015 календарному году.

Более того:

  • 2021 год будет обычным годом, начиная с пятницы : его первые 2 месяца будут соответствовать, кроме 29 февраля, месяцам 2016 календарного года и его следующие 10 месяцев будут соответствовать 2010 календарному году. Конечно, поскольку ни 2010, ни 2021 не являются високосными, эти два года полностью соответствуют друг другу.
  • 2022 год будет обычным годом, начиная с субботы : его первые 2 месяца будут соответствовать годам 2011 календарного года, а последующие 10 месяцев будут соответствовать 2016 календарному году. Конечно, поскольку ни 2011, ни 2022 не являются високосными, эти два года полностью соответствуют друг другу.
  • 2023 год будет обычным годом, начиная с воскресенья : год в целом будет соответствуют календарному году 2017.
  • 2024 год будет високосным, начиная с понедельника : его первые 2 месяца, за исключением 29 февраля, будут соответствовать месяцам 2018 календарного года и его последующие 10 месяцев будут соответствовать 2019 календарному году. Год в целом будет соответствовать 1996 календарному году. 29 февраля будет четверг.

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

Год. века по модулю 28y
00 06 12 17 230
01 07 12 18 241
02 08 13 19 242
03 08 14 20 253
04 09 15 20 264
04 10 16 21 275
05 11 16 22 006

Примечания:

  • Черный цвет означает все месяцы обычного года
  • Красный означает первые 2 месяца високосного года
  • Синий означает последние 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 BC начинается в четверг. В пролептическом григорианском календаре (названном так, потому что он не был изобретен до 1582 года) 1 год до нашей эры начинается в субботу.

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

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

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

Сотни летЦифры оставшегося годаМесяцD. o. W#
юлианский. (r ÷ 7)григорианский. (r ÷ 4)
r5191620r000 06 17 232834 45 515662 73 798490янвоктябрьSa0
r41815 19 r301 07 121829 35 404657 63 687485 91 96майSu1
r317
н / д
02 13 19 2430 41 47 5258 69 75 8086 97февавгM2
r21618 22 r203 08 14 2531 36 42 5359 64 70 8187 9298февмартнояTu3
r115
н / д
09 15 202637 43 485465 71 768293 99июнW4
r01417 21 r10410 21 273238 49 556066 77 838894сендекTh5
r613
н / д
05 11 162233 39 445061 67 727889 95ЯнваприюлF6

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

  • день месяца: 1 ~ 31 (1)
  • месяц: (6)
  • год: (0)
  • век по модулю 4 по григорианскому календарю и по модулю 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, 19x7 = 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 октября. Если это воскресенье, воскресная буква A, если суббота B, и аналогично назад через неделю и вперед по алфавиту до понедельника, который равен G.

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

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

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

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

Судный день

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

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

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

ИндексПн. AВт. BСр. CЧт. DПт. EСб. FВс. GВечный григорианский и юлианский календарь. Использовать январь и февраль для високосных лет. Буква даты в строке года для буквы в строке столетия

Все дни C - это судные дни

Юлиан. векгригорианский. векДата01. 08. 15. 22. 2902. 09. 16. 23. 3003. 10. 17. 24. 3104. 11. 18. 25..05. 12. 19. 26..06. 13. 20. 27..07. 14. 21. 28..
12 1916 20априюлянвGABCDEF010712182935404657636874859196
13 20сендекFGABCDE0213192430414752586975808697
14 2117 21июнEFGABCD030814253136425359647081879298
15 22февмарнояDEFGABC0915202637434854657176829399
16 2318 22авгфевральCDEFGAB0410212732384955606677838894
17 24майBCDEFGA0511162233394450616772788995
18 2519 23янвоктABCDEFG0617232834455156627379849000
[Год / 100 ]григорианский. век20. 1621. 1722. 1823. 19Годовая модификация 100
Юлиан. век19. 1220. 1321. 1422. 1523. 1624. 1725. 18

Примеры:

  • Для обычного метода
26 декабря 1893 г. (GD)

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

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

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

1 января 2000 г. (GD)

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

Краткая формула для метода: «Буква даты (G), буква (G) в строке года (00) для буквы (F) в строке столетия (20), а для дня - буква (F) становится днем ​​недели (суббота) ".

Метод воскресной буквы

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

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

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

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

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

В рукописной заметке в коллекции астрономических таблиц Карл Фридрих Гаусс описал метод расчета дня неделя 1 января любого года. Он его никогда не публиковал. Наконец, в 1927 году он был включен в его собрание сочинений.

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

R (1 + 5 R (A - 1, 4) + 4 R (A - 1, 100) + 6 R (A - 1, 400), 7) {\ displaystyle R (1 + 5R (A-1,4) + 4R (A-1,100) + 6R (A-1,400), 7)}R (1 + 5R (A-1,4) + 4R (A-1,100) + 6R (A-1,400), 7)

или

R (1 + 5 Р (Y - 1, 4) + 3 (Y - 1) + 5 R (C, 4), 7) {\ Displaystyle R (1 + 5R (Y-1,4) +3 (Y-1) + 5R (C, 4), 7)}{\ displaystyle R (1 + 5R (Y-1,4) +3 (Y-1) + 5R (C, 4), 7)}

, из которого можно вывести метод юлианского календаря

R (6 + 5 R (A - 1, 4) + 3 (A - 1), 7) { \ Displaystyle R (6 + 5R (A-1,4) +3 (A-1), 7)}{\ displaystyle R (6 + 5R (A-1,4) +3 (A-1), 7)}

или

R (6 + 5 R (Y - 1, 4) + 3 (Y - 1) + 6 C, 7) {\ displaystyle R (6 + 5R (Y-1,4) +3 (Y-1) + 6C, 7)}{\ displaystyle R (6 + 5R (Y-1,4) + 3 (Y-1) + 6C, 7)}

где R (y, m) { \ displaystyle R (y, m)}R (y, m) - это остаток после деления y на m или y по модулю m, а Y + 100C = A.

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

= R (1 + 5 R (1999, 4) + 4 R (1999, 100) + 6 R (1999, 400), 7) = R (1 + 1 + 4 + 0, 7) = 6 {\ displaystyle {\ begin {align} = R (1 + 5R (199 9,4) + 4R (1999,100) + 6R (1999,400), 7) \\ = R (1 + 1 + 4 + 0,7) \\ = 6 \ end {выровнено}}}{\ displaystyle {\ begin {align} = R (1 + 5R (1999,4)+ 4R (1999, 100) + 6R (1999,400), 7) \\ = R (1 + 1 + 4 + 0,7) \\ = 6 \ end {align}}}
= R (1 + 5 R (99, 4) + 3 × 99 + 5 R (19, 4), 7) = R (1 + 1 + 3 + 1, 7) = 6 = S в день. {\ Displaystyle {\ begin {align} = R (1 + 5R (99,4) +3 \ times 99 + 5R (19,4), 7) \\ = R (1 + 1 + 3 + 1, 7) \\ = 6 = суббота. \ End {align}}}{\ displaystyle {\ begin {выровнено} = R (1 + 5R (99,4) +3 \ times 99 + 5R (19,4), 7) \\ = R (1 + 1 + 3 + 1,7) \\ = 6 = Суббота. \ End {align}}}

День недели последнего дня в году номер A - 1 или 0 января в году номер A равен

R (5 R (A - 1, 4) + 4 R (A - 1, 100) + 6 R (A - 1, 400), 7) {\ displaystyle R (5R (A-1,4) + 4R (A-1,100) + 6R ( A-1,400), 7)}{\ displaystyle R (5R (A-1,4) + 4R (A-1,100) + 6R (A -1 400), 7)}

День недели 0 (обычный год) или 1 (високосный год) января в году номер A равен

R (6 + 5 R (A, 4) + 4 R (A, 100) + 6 R (A, 400), 7) {\ displaystyle R (6 + 5R (A, 4) + 4R (A, 100) + 6R (A, 400), 7)}{\ Displaystyle R (6 + 5R (A, 4) + 4R (A, 100) + 6R (A, 400), 7)}

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

Месяцы11. Янв12. Фев1. Мар2. Апр3. Май4. Июнь5. Июл6. Авг7. Сен8. Октябрь9. Ноя10. ДекM
Обычные годы033614625035m
Високосные годы4025036146
Алгоритмm = R (⌈ 2,6 M ⌉, 7) {\ displaystyle m = R (\ left \ lceil 2.6M \ right \ rceil, 7) }{ \ Displaystyle м = р (\ влево \ lceil 2,6M \ вправо \ rceil, 7)}

Примечание: минус 1, если M равно 11 или 12, и плюс 1, если M меньше 11 в високосный год.

День недели для любого дня в году с номером A равен

R (D + m + 5 R (A - 1, 4) + 4 R (A - 1, 100) + 6 R). (A - 1, 400), 7) {\ displaystyle R (D + m + 5R (A-1,4) + 4R (A-1,100) + 6R (A-1,400), 7)}{\ displaystyle R (D + m + 5R (A-1,4) + 4R (A-1,100) + 6R (A-1,400), 7)}

или

р (6 + D + ⌈ 2,6 M ⌉ + 5 р (A, 4) + 4 R (A, 100) + 6 R (A, 400), 7) {\ displaystyle R (6 + D + \ left \ lceil 2.6M \ right \ rceil + 5R (A, 4) + 4R (A, 100) + 6R (A, 400), 7)}{\ displaystyle R (6 + D + \ left \ lceil 2.6M \ right \ rceil + 5R (A, 4) + 4R (A, 100) + 6R (A, 400), 7)}

где D - день месяца, а A - 1 для января или Февраль

Дни недели для 30 апреля 1777 г. и 23 февраля 1855 г. равны

= R (30 + 6 + 5 R (1776, 4) + 4 R (1776, 100)) + 6 R (1776, 400), 7) = R (2 + 6 + 0 + 3 + 6, 7) = 3 = среда {\ displaystyle {\ begin {align} = R (30 + 6 + 5R ( 1776,4) + 4R (1776,100) + 6R (1776,400), 7) \\ = R (2 + 6 + 0 + 3 + 6,7) \\ = 3 = среда \ end {выровнено }}}{\ displaystyle {\ begin {align} = R (30 + 6 + 5R (1776, 4) + 4R (1776,100) + 6R (1776,400), 7) \\ = R (2 + 6 + 0 + 3 + 6,7) \\ = 3 = среда \ конец {выровнено} }}

и

= R (6 + 23 + 2,6 × 12 ⌉ + 5 R (1854, 4) + 4 R (1854, 100) + 6 R (1854, 400), 7) = R (6 + 2 + 4 + 3 + 6 + 5, 7) = 5 = F ридай. {\ displaystyle {\ begin {align} = R (6 + 23 + \ left \ lceil 2,6 \ times 12\ right \ rceil + 5R (1854,4) + 4R (1854,100) + 6R (1854,400), 7) \\ = R (6 + 2 + 4 + 3 + 6 + 5,7) \\ = 5 = Пятница. \ End {align}}}{\ displaystyle {\ begin {align} = R (6 + 23 + \ левый \ lceil 2,6 \ times 12 \ right \ rceil + 5R (1854,4) + 4R (1854,100) + 6R (1854,400), 7) \\ = R (6 + 2 + 4 + 3 + 6 +5,7) \\ = 5 = пятница. \ End {align}}}

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

Несопоставимые вариации

Другой вариант вышеупомянутого алгоритма также работает без таблиц поиска. Небольшой недостаток - необычная схема подсчета месяцев и лет. Формула:

вес = (d + ⌊ 2,6 м - 0,2 ⌋ + y + ⌊ y 4 ⌋ + ⌊ c 4 ⌋ - 2 c) по модулю 7, {\ displaystyle w = \ left (d + \ lfloor 2,6m - 0,2 \ rfloor + y + \ left \ lfloor {\ frac {y} {4}} \ right \ rfloor + \ left \ lfloor {\ frac {c} {4}} \ right \ rfloor -2c \ right) {\ bmod {7}},}w = \ left (d + \ lfloor 2,6m-0,2 \ rfloor + y + \ left \ lfloor {\ frac {y } {4}} \ right \ rfloor + \ left \ lfloor {\ frac {c} {4}} \ right \ rfloor -2c \ right) {\ bmod {7}},

где

  • Y - год минус 1 для января или февраля, а год для любого другого месяца
  • y - это последние 2 цифры Y
  • c - первые две цифры Y
  • d - день месяца (от 1 до 31)
  • m - месяц со сдвигом (март = 1,..., февраль = 12)
  • w - день недели (0 = воскресенье,..., 6 = суббота). Если w отрицательно, к нему нужно прибавить 7.

Например, 1 января 2000 г. (год - 1 для января)

w = (1 + ⌊ 2,6 11 - 0,2 ⌋ + (0 - 1) + ⌊ 0-1 4 ⌋ + ⌊ 20 4 ⌋ - 2 ⋅ 20) по модулю 7 = (1 + 28-1-1 + 5-40) по модулю 7 = 6 = суббота {\ displaystyle {\ begin {align} w = \ left (1+ \ lfloor 2.6 \ cdot 11-0.2 \ rfloor + (0-1) + \ left \ lfloor {\ frac {0-1} {4}} \ right \ rfloor + \ left \ lfloor {\ frac {20} {4}} \ right \ rfloor -2 \ cdot 20 \ right) {\ bmod {7}} \\ = (1 + 28-1-1 + 5-40) {\ bmod {7}} \\ = 6 = {\ text {суббота}} \ end { align}}}{\ begin {align} w = \ left (1+ \ lfloor 2.6 \ cdot 11-0.2 \ rfloor + (0-1) + \ left \ lfloor {\ frac {0-1} {4}} \ right \ rfloor + \ left \ lfloor {\ frac {20} {4}} \ right \ rfloor -2 \ cdot 20 \ right) {\ bmod {7}} \\ = (1 + 28-1-1 + 5-40) {\ bmod {7}} \\ = 6 = {\ text {суббота}} \ end {выравнивается}}
w = (1 + 2,6 11 - 0,2 ⌋ + (100 - 1) + ⌊ 100 - 1 4 ⌋ + ⌊ 20-1 4 ⌋ - 2 ⋅ (20-1)) по модулю 7 = (1 + 28 + 99 + 24 + 4-38) по модулю 7 = 6 = суббота {\ displaystyle {\ begin {align} w = \ left (1+ \ lfloor 2.6 \ cdot 11-0.2 \ rfloor + (100-1) + \ left \ lfloor {\ frac {100-1} {4}} \ right \ rfloor + \ left \ lfloor {\ frac {20-1} {4}} \ right \ rfloor -2 \ cdot (20-1) \ right) {\ bmod {7}} \\ = (1 + 28 + 99 + 24 + 4-38) {\ bmod {7}} \\ = 6 = { \ text {суббота}} \ end {align}}}{\ begin {align} w = \ left (1+ \ lfloor 2.6 \ cdot 11-0.2 \ rfloor + (100-1) + \ left \ lfloor {\ frac {100-1} {4}} \ right \ rfloor + \ left \ lfloor {\ frac {20-1} {4}} \ right \ rfloor -2 \ cdot (20-1) \ right) {\ bmod {7}} \\ = (1 + 28 + 99 + 24 + 4-38) {\ bmod {7}} \\ = 6 = {\ text {Суббота}} \ end {align}}

Примечание: первое первое значено только для високосного года 00, а второе - для f или любые 00 лет.

Термин ⌊ 2,6 м - 0,2 ⌋ mod 7 {\ displaystyle \ lfloor 2.6m-0.2 \ rfloor \ mod 7}{\ displaystyle \ lfloor 2,6–0,2 \ rfloor \ mod 7} дает значения месяцев: m

Месяцыm
январь0
февраль3
март2
апрель5
май0
июнь3
июль5
август1
сентябрь4
октябрь6
ноябрь2
декабрь4

Термин y + ⌊ y 4 ⌋ mod 7 {\ displaystyle y + \ left \ lfloor {\ frac {y} {4}} \ right \ rfloor \ mod 7}{\ displaystyle y + \ левый \ lfloor {\ frac {y} {4}} \ right \ rfloor \ mod 7} дает значения лет: y

y mod 28y
01 07 12 18 -1
02-13 19 242
03 08 14-253
- 09 15 20 264
04 10-21 275
05 11 16 22 -6
06-17 23 000

Термин (⌊ c 4 ⌋ - 2 c) mod 7 {\ displaystyle \ left (\ left \ lfloor {\ frac {c} { 4}} \ right \ rfloor -2c \ right) \ mod 7}{\ displaystyle \ left (\ le ft \ lfloor {\ frac {c} {4}} \ right \ rfloor -2c \ right) \ mod 7} дает значения столетий: c

c mod 4c
15
23
31
00

Теперь из общей формулы: вес = d + m + y + c mod 7 {\ displaystyle w = d + m + y + c {\ bmod {7}}}w = d + m + y + c {\ bmod {7}} ; 1 января 2000 г. можно пересчитать следующим образом:

w = 1 + 0 + 5 + 0 mod 7 = 6 = суббота d = 1, m = 0 y = 5 (0-1 mod 2 8 = 27) c = 0 (20 mod 4 = 0) {\ displaystyle {\ begin {align} w = 1 + 0 + 5 + 0 {\ bmod {7}} = 6 = {\ text {суббота}} \\ d = 1, m = 0 \ \ y = 5 (0-1 {\ bmod {2}} 8 = 27) \\ c = 0 (20 {\ bmod {4}} = 0) \ end {align}}}{\ begin {align} w = 1 + 0 + 5 + 0 {\ bmod {7}} = 6 = {\ text {суббота}} \\ d = 1, m = 0 \\ y = 5 (0-1 {\ bmod { 2}} 8 = 27) \\ c = 0 (20 {\ bmod {4}} = 0) \ end {выровнено}}

w Знак равно 1 + 0 + 4 + 1 мод 7 = 6 = суббота d = 1, m = 0 y = 4 (99 мод 2 8 = 15) c = 1 (20-1 модуль 4 = 3) {\ displaystyle {\ begin {выровнено} w = 1 + 0 + 4 + 1 {\ bmod {7}} = 6 = {\ text {суббота}} \\ d = 1, m = 0 \\ y = 4 (99 {\ bmod {2}} 8 = 15) \\ c = 1 (20-1 {\ bmod {4}} = 3) \ end {align}}}{\ begin {align} w = 1 + 0 + 4 + 1 {\ bmod {7}} = 6 = {\ text {суббота}} \\ d = 1, m = 0 \\ y = 4 (99 {\ bmod {2}} 8 = 15) \\ c = 1 (20-1 {\ bmod {4}} = 3) \ end {align}}

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

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

w ≡ (⌊ 13 (m + 1) 5 ⌋ + ⌊ y 4 ⌋ + ⌊ c 4 ⌋ + d + Y - 2 c) mod 7 {\ displaystyle w \ Equiv \ left (\ left \ lfloor {\ frac {13 (m + 1)} {5}} \ right \ rfloor + \ left \ lfloor {\ frac {y} {4}} \ right \ rfloor + \ left \ lfloor {\ frac {c } {4}} \ right \ rfloor + d + y-2c \ right) {\ bmod {7}}}{\ Displaystyle w \ Equiv \ left (\ left \ lfloor {\ frac {13 (m + 1)} {5}} \ right \ rfloor + \ left \ lfloor {\ frac {y} {4}} \ right \ rfloor + \ left \ lfloor {\ frac {c} { 4}} \ right \ rfloor + d + y-2c \ right) {\ bmod {7}}}

где

  • Y - год минус 1 для января или февраля, а год для любого другого месяца
  • y - это последние 2 цифры Y
  • c - первые 2 цифры Y
  • d - день месяца (от 1 до 31)
  • m - месяц со смещением (март = 3,... январь = 13, февраль = 14)
  • w - день недели (1 = воскресенье,.. 0 = суббота)

Единственное различие между алгоритмом Зеллера (Z) и алгоритмом Гаусса (G), то есть Z - G = 1 = воскресенье.

(d + ⌊ (m + 1) 2,6 ⌋ + y + ⌊ y / 4 ⌋ + ⌊ c / 4 ⌋ - 2 c) mod 7 - (d + ⌊ 2,6 m - 0,2 ⌋ + Y + ⌊ Y / 4 ⌋ + ⌊ с / 4 ⌋ - 2 с) mod 7 {\ displaystyle (d + \ lfloor (m + 1) 2,6 \ rfloor + y + \ lfloor y / 4 \ rfloor + \ lfloor c / 4 \ rfloor -2c) {\ bmod {7}} - (d + \ lfloor 2,6 м-0,2 \ rfloor + y + \ lfloor y / 4 \ rfloor + \ lfloor c / 4 \ rfloor -2c) {\ bmod {7}}}(d + \ lfloor (m + 1) 2.6 \ rfloor + y + \ lfloor y / 4 \ rfloor + \ lfloor c / 4 \ rfloor -2c) {\ bmod {7}} - (d + \ lfloor 2.6m-0.2 \ rfloor + y + \ lfloor y / 4 \ rfloor + \ lfloor c / 4 \ rfloor -2c) {\ bmod {7}}
= (⌊ (м + 2 + 1) 2,6 - (2,6 м - 0,2) ⌋) mod 7 {\ displaystyle = (\ lfloor ( m + 2 + 1) 2,6- (2,6m-0,2) \ rfloor) {\ bmod {7}}}= (\ lfloor (m + 2 + 1) 2,6- (2,6 м-0,2) \ rfloor) {\ bmod {7}} (март = 3 в Z, но март = 1 в G)
= (⌊ 2,6 м + 7,8 - 2,6 м + 0,2 ⌋) по модулю 7 {\ displaystyle = (\ lfloor 2.6m + 7,8-2,6 м + 0,2 \ rfloor) {\ bmod {7}}}= (\ lfloor 2,6 м + 7,8-2,6 м + 0,2 \ rfloor) {\ bmod {7}}
= 8 mod 7 = 1 {\ displaystyle = 8 {\ bmod {7}} = 1}= 8 {\ bmod {7}} = 1

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

Месяцыm
Январь1
Февраль4
Март3
Апрель6
Май1
Июнь4
Июль6
Август2
сентябрь5
октябрь0
ноябрь3
декабрь5

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

алгоритм Вана для григорианского календаря (формула должна быть вычтена увеличивается на 1, если m 1 или 2 и год високосный).

w = (d - d 0 (m) + y 0 - y 1 + ⌊ Y 0/4 - y 1/2 ⌋ - 2 (c mod 4)) mod 7, {\ displaystyle w = \ left (d-d_ {0} (m) + y_ {0} -y_ {1} + \ left \ lfloor y_ {0} / 4-y_ {1} / 2 \ right \ rfloor -2 \ left (c {\ bmod {4}} \ right) \ right) {\ bmod {7}},}{\ displaystyle w = \ left (d-d_ {0} (m) + y_ {0} -y_ {1} + \ left \ lfloor y_ {0} / 4-y_ {1}) / 2 \ right \ rfloor -2 \ left (c {\ bmod {4}} \ right) \ right) {\ bmod {7}},}

где

  • y 0 {\ displaystyle y_ {0}}y_ {0 } - последняя цифра года;
  • y 1 {\ displaystyle y_ {1}}y_ {1} - последняя вторая цифра года
  • c {\ displaystyle c}с - первые 2 цифры года
  • d {\ displaystyle d}d - день месяца (от 1 до 31)
  • m {\ displaystyle m}m - это месяц (январь = 1,... декабрь = 12)
  • w {\ displaystyle w}w- день недели (0 = воскресенье,.. 6 = суббота)
  • d 0 (m) {\ displaystyle d_ {0} (m)}{\ displaystyle d_ {0} (м)} - функция нулевого дня со значениями, перечисленными в следующей таблице
md 0 (m) {\ displaystyle d_ {0} (m)}{\ displaystyle d_ {0} (м)}
11День
35m + 2
57
79
93m + 1
1112
212m + 3
42m - 2
64
86
108
1210

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

w = (d - d 0 (m) + y 0 - y 1 + ⌊ Y 0/4 - y 1/2 ⌋ - c) mod 7, {\ displaystyle w = \ left (d-d_ {0} (m) + y_ {0} -y_ {1} + \ left \ lfloor y_ {0} / 4-y_ {1} / 2 \ right \ rfloor -c \ right) {\ bmod {7}},}{\ displaystyle w = \ left (d-d_ {0} (m) + y_ {0} -y_ {1} + \ left \ lfloor y_ {0} / 4-y_ {1} / 2 \ right \ rfloor -c \ right) {\ bmod {7}},}

где d 0 (m) {\ displaystyle d_ {0} (м)}{\ displaystyle d_ {0} (м)} - судный день.

md 0 (m) {\ displaystyle d_ {0} (m)}{\ displaystyle d_ {0} (м)}
13C день
37m + 4
59
711
95m - 4
117
20m - 2
44m
66
88
1010
1212
Другие алгоритмы

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

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

c = ⌊ y 100 ⌋ и g = y - 100 c, {\ displaystyle c = \ left \ lfloor {\ frac {y} {100}} \ right \ rfloor \ quad {\ text {and}} \ quad g = y-100c,}c = \ left \ lfloor {\ frac {y} {100}} \ right \ rfloor \ quad {\ text {and}} \ quad g = y-100c,

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

c = ⌊ y - 1 100 ⌋ и g = y - 1 - 100 c. {\ displaystyle c = \ left \ lfloor {\ frac {y-1} {100}} \ right \ rfloor \ quad {\ text {and}} \ quad g = y-1-100c.}c = \ left \ lfloor {\ frac {y-1 } {100}} \ right \ rfloor \ quad {\ text {and}} \ quad g = y-1-100c.

Формула для дня недели

w = (d + e + f + g + ⌊ g 4 ⌋) mod 7, {\ displaystyle w = \ left (d + e + f + g + \ left \ lfloor {\ frac {g}) {4}} \ right \ rfloor \ right) {\ bmod {7}},}{\ displaystyle w = \ left (d + е + е + g + \ влево \ lfloor {\ frac {g} {4}} \ right \ rfloor \ right) {\ bmod {7}},}

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

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

m123456789101112
e032503514624

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

c mod 40123
f0531

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

c mod 70123456
f5432106

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

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

Алгоритм:

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

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

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

Год-элемент: сложите количество десятков, избыток и количество четверок в избытке.

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

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

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

Примеры:

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». Ответ: «Среда».

23 февраля 1676 года (считая февраль вторым месяцем) для Кэрролла совпадает с 4 марта 1676 года по григорианскому календарю, он не может прийти к правильному ответу, а именно «пятница», для старого стиля даты, которая по григорианскому календарю совпадает с днем ​​5 марта 1677 года. Если бы он правильно предположил, что год начинается 25 марта, его метод учитывал разные номера года - точно так же, как День рождения Джорджа Вашингтона отличается - в двух календарях.

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

В 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 году Майкл Кейт и Том Крейвер опубликовали вышеупомянутое выражение, которое стремится минимизировать количество нажатий клавиш, необходимых для ввода автономной функции для преобразования даты по григорианскому календарю в числовой день недели. Он не сохраняет ни y, ни dи возвращает 0= воскресенье, 1= понедельник и т. д.

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

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

Табличный предшественник алгоритма Тёндеринга воплощен в f следующая функция KR C. С небольшими изменениями он был адаптирован для других языков программирования высокого уровня, таких как APL2. Размещено Томохико Сакамото на comp.lang.c группе новостей Usenet в 1992 г., оно актуально для любой даты по григорианскому календарю.

dayofweek (y, m, d) / * 1 <= m <= 12, y>1752 (в Великобритании) * / {static int t = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4}; y - = m < 3; return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7; }

Функция не всегда сохраняет yи возвращает 0= воскресенье, 1= понедельник и т. д., следующее выражение

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

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

Rata Die

IBM Rata Die метод требует, чтобы кто-то знал «ключевой день» пролептического григорианского календаря, т.е. день недели 1 января 1 года нашей эры (его первая дата). Это необходимо сделать, чтобы установить оставшееся число, на основании которого определяется день недели для последней части анализа. Используя заданный день 13 августа 2009 г., который был четвергом, в качестве эталона, где Base и n - количество дней и недель, прошедших с 01.01.01 по данный день, соответственно, и k - день в данном неделя, которая должна быть меньше 7, Base выражается как

Base = 7n + k (i)

Зная, что год, делимый на 4 или 400, является високосным годом, а год, делимым на 100, а не 400 - это не високосный год, можно написать программу, чтобы найти количество дней. Ниже приводится перевод на C метода IBM для своего языка программирования REXX.

int daystotal (int y, int m, int d) {static char daytab [2] [13] = {{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}}; int daystotal = d; for (int year = 1; year <= y ; year++) { int max_month = ( year < y ? 12 : m-1); int leap = (year%4 == 0); if (year%100 == 0 year%400 != 0) leap = 0; for (int month = 1 ; month <= max_month ; month++) { daystotal += daytab[leap][month]; } } return daystotal; }

Было обнаружено, что daystotalравно 733632 от базовой даты 1 января 1 года нашей эры. Это общее количество дней можно проверить простым вычислением: С 01.01.10001 уже есть 2008 полных лет. Общее количество дней в 2008 году без учета високосных дней составляет 365 * 2008 = 732920 дней. Предположим, что все годы делятся на 4 високосные. Добавьте 2008/4 = 502 к общему количеству; вычтите 15 високосных дней, потому что годы, которые уже прошли, то есть на 100, но не на 400, не являются високосными. 31 + 28 + 31 + 30 + 31 + 30 + 31 = 212 дней и 13 дней августа, чтобы получить Base = 732920 + 502-20 + 5 + 212 + 13 = 733632.

Это означает, что с указанная дата прошла 733632 дня. Подставьте значение в приведенное выше уравнение (i), чтобы получить 733632 = 7 * 104804 + 4, n = 104804 и k = 4, что означает, что 13 августа 20 09 г. - четвертый день из 104805-й недели с 01.01.10001.. 13 августа 2009 г. - четверг; Следовательно, первым днем ​​недели должен быть понедельник, и делается вывод, что первый день 01.01.1000 календаря - понедельник. Исходя из этого, остаток от отношений Base / 7, определенный выше как k, определяет, какой сегодня день недели. Если k = 0, то понедельник, k = 1, вторник и т. Д.

См. Также
Ссылки
Внешние ссылки
Последняя правка сделана 2021-05-17 03:13:36
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте