Сравнение Целлера - Zeller's congruence

Сравнение Зеллера - это алгоритм, разработанный Кристианом Целлером для вычисления дня недели для любой даты в юлианском или григорианском календаре . Можно считать, что он основан на преобразовании между юлианским днем и календарной датой.

Формула

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

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

куда

  • h - день недели (0 = суббота, 1 = воскресенье, 2 = понедельник, ..., 6 = пятница)
  • q - день месяца
  • m - месяц (3 = март, 4 = апрель, 5 = май, ..., 14 = февраль)
  • K год века ( ).
  • J - век с отсчетом от нуля (на самом деле ). Например, века с отсчетом от нуля для 1995 и 2000 годов равны 19 и 20 соответственно (не путать с обычным порядковым перечислением столетий, которое указывает 20-е в обоих случаях).
  • это функция пола или целая часть
  • mod - операция по модулю или остаток после деления

В этом алгоритме январь и февраль считаются 13 и 14 месяцами предыдущего года. Например, если это 2 февраля 2010 года, алгоритм считает дату вторым днем ​​четырнадцатого месяца 2009 года (14.02.2009 в формате ДД / ММ / ГГГГ).

Для недельной даты ISO День недели d (1 = с понедельника по 7 = воскресенье) используйте

Анализ

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

Поэтому для григорианского календаря различные части этой формулы можно понимать следующим образом:

  • представляет прогрессию дня недели в зависимости от дня месяца, поскольку каждый последующий день приводит к дополнительному смещению 1 в день недели.
  • представляет собой изменение дня недели в зависимости от года. Предполагая, что каждый год длится 365 дней, одна и та же дата в каждом последующем году будет смещена на значение .
  • Поскольку в каждом високосном году 366 дней, это необходимо учитывать, добавляя еще один день к значению смещения дня недели. Это достигается добавлением к смещению. Этот член рассчитывается как целочисленный результат. Любой остаток отбрасывается.
  • Используя аналогичную логику, прогрессию дня недели для каждого столетия можно рассчитать, наблюдая, что 36524 дня в нормальном столетии и 36525 дней в каждом столетии делятся на 400. Так как и , термин учитывает это.
  • Срок корректируется с учетом количества дней месяца. Начиная с января дни в месяце: {31, 28/29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}. Дни 28 или 29 февраля являются проблемой, поэтому формула переносит январь и февраль до конца, поэтому короткий счет февраля не вызовет проблемы. Формула интересуется днями недели, поэтому числа в последовательности можно взять по модулю 7. Тогда количество дней в месяце по модулю 7 (все еще начиная с января) будет {3, 0/1, 3, 2 , 3, 2, 3, 3, 2, 3, 2, 3}. Начиная с марта, последовательность в основном чередуется 3, 2, 3, 2, 3, но каждые пять месяцев подряд идут два 31-дневных месяца (июль – август и декабрь – январь). Дробь 13/5 = 2,6 и функция пола имеют этот эффект; знаменатель 5 устанавливает период в 5 месяцев.
  • Общая функция нормализует результат, чтобы он находился в диапазоне от 0 до 6, что дает индекс правильного дня недели для анализируемой даты.

Причина, по которой формула отличается для юлианского календаря, заключается в том, что в этом календаре нет отдельного правила для високосных столетий и он смещен от григорианского календаря на фиксированное количество дней в каждом столетии.

Поскольку григорианский календарь был принят в разное время в разных регионах мира, местоположение события имеет важное значение для определения правильного дня недели для даты, которая произошла в течение этого переходного периода. Это требуется только до 1929 года, поскольку это был последний год, когда юлианский календарь все еще использовался какой-либо страной на Земле, и, следовательно, не требуется для 1930 года или позже.

Формулы могут использоваться пролептически , но «Год 0» фактически соответствует 1 году до нашей эры (см. Нумерацию астрономических лет ). Юлианский календарь фактически является пролептическим вплоть до 1 марта 4 г. н.э. из-за плохого управления в Риме (но не в Египте) в период, когда календарь был введен в действие 1 января 45 г. до н.э. (который не был високосным). Кроме того, оператор по модулю может обрезать целые числа в неправильном направлении (потолок вместо пола). Чтобы учесть это, можно добавить достаточное число, кратное 400 по григорианскому календарю или 700 юлианским годам.

Примеры

Для 1 января 2000 года датой будет считаться 13-й месяц 1999 года, поэтому значения будут следующими:

Таким образом, формула оценивается как .

(36 происходит от , усеченное до целого числа.)

Однако для 1 марта 2000 года датой считается 3-й месяц 2000 года, поэтому значения становятся

поэтому формула оценивается как .

Реализации в программном обеспечении

Базовая модификация

Формулы основаны на математическом определении деления по модулю , что означает, что −2 mod 7 равно положительному 5. К сожалению, усекающим способом большинство компьютерных языков реализует функцию остатка, −2 mod 7 возвращает результат −2. Итак, чтобы реализовать сравнение Целлера на компьютере, формулы следует немного изменить, чтобы числитель был положительным. Самый простой способ сделать это - заменить - 2 J на + 5 Дж и - J на + 6 Дж . Таким образом формулы становятся:

по григорианскому календарю и

по юлианскому календарю.

Нетрудно увидеть, что в данном году 1 марта (если это суббота, то 2 марта) является хорошей датой для проверки; и что в данном столетии лучший тестовый год - это год, кратный 100.

Общее упрощение

Зеллер использовал десятичную арифметику и нашел удобным использовать J и K для обозначения года. Но при использовании компьютера проще обрабатывать измененные год Y и месяц m , которые равны Y - 1 и m + 3 в течение января и февраля:

для григорианского календаря (в этом случае нет возможности переполнения, потому что ), и

по юлианскому календарю.

Вышеупомянутый алгоритм упоминается для григорианского случая в RFC  3339 , Приложение B, хотя и в сокращенной форме, которая возвращает 0 для воскресенья.

Другие варианты

По крайней мере, три других алгоритма разделяют общую структуру сравнения Целлера в его типе «общего упрощения», также используя m ∈ [3, 14] ∩ Z и конструкцию «модифицированный год».

  • Майкл Кейт опубликовал отрывок очень короткого кода C в 1990 году для григорианских дат. Компонент длины месяца ( ) заменяется на .
  • Дж. Р. Стоктон предлагает версию Sunday-is-0 , назвав ее разновидностью Zeller.
  • Клаус Тёндеринг описывает как замену.

Можно показать, что оба выражения прогрессируют на единицу по сравнению с исходным компонентом длины месяца в требуемом диапазоне m , что приводит к начальному значению 0 для воскресенья.

Смотрите также

использованная литература

Библиография

В каждом из этих четырех похожих листов с изображениями, во-первых, рассматривается день недели, а во-вторых, дата пасхального воскресенья для юлианского и григорианского календарей. На страницах есть ссылки на переводы на английский язык.

внешние ссылки