Модуль для расчета дат Пасхи и дат относительно Пасхи.
Calculate
Функция для расчета даты Пасхи или даты события, связанного с Пасхой.
Поле | Цель | Пример аргумента |
---|---|---|
1 | Год | 2025 или1882 |
метод | Метод расчета даты Пасхи:
| Eastern для расчета даты Пасхи в православном обряде. |
день | Название события, связанного с датой Пасхи или целым числом дней до (отрицательное) или после (положительное) Пасхального воскресенья. Следующие дни доступны по названию:
| 49 или взаимозаменяемоPentecost |
формат | Описывает формат даты в конечном выводе, который совпадает с используемым в функции парсера #time. Формат по умолчанию — Y-m-d . Существует специальное значение none , которое предотвращает форматирование окончательной даты. | j xd |
{{#invoke:Easter|Calculate|{{CURRENTYEAR}}}}
{{#invoke:Easter|Calculate|{{CURRENTYEAR}}|method=Eastern}}
{{#invoke:Easter|Calculate|{{CURRENTYEAR}}|format=[[j xg]]}}
{{#invoke:Easter|Calculate|{{CURRENTYEAR}}|method=Eastern|format=[[j xg]]}}
{{#invoke:Easter|Calculate|{{CURRENTYEAR}}|day=Ash Wednesday}}
{{#invoke:Easter|Calculate|{{CURRENTYEAR}}|method=Eastern|day=Ash Wednesday}}
{{#invoke:Easter|Calculate|{{CURRENTYEAR}}|format=[[j xg]] (l)|day=Ash Wednesday}}
{{#invoke:Easter|Calculate|{{CURRENTYEAR}}|method=Eastern|format=[[j xg]] (l)|day=Ash Wednesday}}
local m = {} local EasterData = { defaultMethod = 3 , -- метод расчета даты Пасхи по умолчанию, если тип Пасхи не указан defaultFormat = "Ymd" , -- формат вывода даты по умолчанию noFormat = "none" , -- запретить форматирование окончательной даты defaultOffset = 0 , -- минимальный смещение даты Пасхи = - 63 , -- максимальный смещение Септуагесимы = 69 , -- Праздник Непорочного Сердца Марии -- API apiEaster = "Calculate" , -- имя публичной функции argEasterYear = 1 , -- индекс или имя аргумента с годом argEasterMethod = "method" , -- индекс или имя аргумента с методом расчета argEasterOffset = "day" , -- индекс или имя аргумента со смещением в днях относительно вычисленного пасхального воскресенья argEasterFormat = "format" , -- индекс или имя аргумента с форматом вывода даты (стиль #time) -- ошибки errorMissingYear = "Отсутствует обязательный аргумент 'year'" , errorInvalidYear = "Неверный аргумент 'year': '%s'" , errorInvalidOffset = "Неверный аргумент 'day': '%s'" , errorInvalidMethod = "Неверный аргумент 'method': '%s'" , errorYearOutOfRange = "Даты Пасхи доступны между 326 и 4099 годами; год: %d" , errorIncorrectMethod = "Западная или православная Пасха существует с 1583 года; год: %d" , errorUnknownMethod = "Неизвестный метод: %d" , methods = { [ "Julian" ] = 1 , -- Восточная дата в юлианском календаре [ "Eastern" ] = 2 , -- Восточная дата в григорианском календаре [ "Orthodox" ] = 2 ,-- псевдоним для восточного [ "коптский" ] = 2 , -- псевдоним для восточного [ "Ethiopian" ] = 2 , -- псевдоним для Eastern [ "Western" ] = 3 , -- Западная дата в григорианском календаре [ "Gregorian" ] = 3 , -- псевдоним для Western [ "Catholic" ] = 3 , -- псевдоним для Western [ "Roman" ] = 3 , -- псевдоним для Western [ "Revised" ] = 4 , -- фактический псевдоним для Western на данный момент [ "Meletian" ] = 4 , -- псевдоним для Revised [ "Astro" ] = 5 , -- фактический псевдоним для Western на данный момент }, -- другие предложенные или реформированные алгоритмы не поддерживаются (пока): -- -- * 4 "Meletian" = "Revised": пересмотренный юлианский календарь с 1923 года, используемый некоторыми православными церквями -- с 900-летним високосным циклом, такой же, как григорианский до 2400 года или около того -- * 5 "Astro": астрономически наблюдаемое Никейское правило на меридиане Иерусалима (предложение Алеппо 1997 г.), -- иногда отличается от Григорианского -- * 6 основано на (эквивалентно) диапазоне действительных дат в апреле: -- * 61 "First": 1-е воскресенье апреля = воскресенье 1–7 апреля -- * 67 "Pepuzite": воскресенье после 6 апреля = воскресенье 7–13 апреля -- * 68 "April" = "Second": 2-е воскресенье апреля = воскресенье 8–14 апреля -- * 69 "Fixed" = "UK": день после второй субботы апреля = воскресенье 9–15 апреля -- * 7 основано на (эквивалентно) диапазоне действительных дней года (DOY): -- * 75 "W14": воскресенье 14-й недели ISO = воскресенье 095–101 -- * 79 "Fifteen": 15-е воскресенье года: воскресенье 099–105 -- * 72 "W15": воскресенье 15-й недели ISO = воскресенье в 102–108 годах -- * "Symmetry": Sym454/Sym010: воскресенье 14-й недели в 293-летнем високосном цикле -- -- Нарушение библейского недельного цикла, любой день недели в григорианском календаре: -- -- * "World": день 099, воскресенье в мировом календаре -- * "Positivist": день 098, воскресенье в позитивистском календаре -- * "Quartodecimanism": 14 нисана в современном еврейском/еврейском календаре, доникейском -- * "Quintodecimanism": 15 нисана в современном еврейском/еврейском календаре,доникейские относительные даты = { [ "Септуагесима" ] = - 63 , [ "Сексагесима" ] = - 56 , [ "Жирный четверг" ] = - 52 , [ "Пятидесятница" ] = - 49 , -- Эстомихи, Масленичное воскресенье [ "Понедельник масленицы" ] = - 48 , -- Понедельник роз [ "Вторник масленицы" ] = - 47 , -- Марди Гра, Карнавал [ "Пепельная среда" ] = - 46 , [ "Воскресенье инвокабит" ] = - 42 , [ "Воскресенье воспоминаний" ] = - 35 , [ "Воскресенье окули" ] = - 28 , [ "Воскресенье латаре" ] = - 21 , -- Материнское воскресенье [ "Страстная неделя" ] = - 7 , [ "Вербное воскресенье" ] = - 7 , [ "Страстный понедельник" ] = - 6 , [ "Страстный вторник" ] = - 5 , [ "Страстная среда" ] = - 4 , [ "Великий четверг" ] = - 3 , [ "Страстная пятница" ] = - 2 , -- Распятие [ "Великая суббота" ] = - 1 , [ "Пасха" ] = 0 , -- Пасхальное воскресенье, Воскресение [ "Пасхальный понедельник" ] = 1 , [ "Воскресенье Божественного Милосердия" ] = 7 , [ "Misericordias Domini" ] = 14 , [ "Ликвидное воскресенье" ] = 21 , [ "Песенное воскресенье" ] = 28 ,[ "Vocem jucunditatis" ] = 35 , [ "Вознесение Четверг" ] = 39 , -- Вознесение [ "Пятидесятница" ] = 49 , -- Троица [ "Понедельник Троицы" ] = 50 , [ "Троица Воскресенье" ] = 56 , [ "Тело Христово" ] = 60 , -- Тело и Кровь Христовы [ "Святое Сердце" ] = 68 , [ "Непорочное Сердце" ] = 69 , }, } local function formatEasterError ( message , ...) if select ( '#' , ... ) > 0 then message = string.format ( message , ...) end return "<span class= \" error \" >" .. message .. "</span>" end local function loadEasterYear ( year ) if not year then return false , formatEasterError ( EasterData . errorMissingYear ) end local result = tonumber ( year ) if not result or math.floor ( result ) ~= result then return false , formatEasterError ( EasterData.errorInvalidYear , year ) end return true , result end local function loadEasterMethod ( method , year ) local result = EasterData.defaultMethod if method then result = EasterData.methods [ method ] if not result then return false , formatEasterError ( EasterData.errorInvalidMethod , метод ) конец конец если год < 1583 тогда результат = 1 конец вернуть истину , результат конец локальная функция loadEasterOffset ( день ) если не день тогда вернуть истину , " " конец локальные данные = EasterData . относительное смещение локальное смещение = tonumber ( день ) если не смещение тогда смещение = данные [ день ] конец если не смещение или смещение ~= math.floor ( смещение ) или смещение < EasterData . минимальное смещение или смещение > EasterData . maximumOffset then return false , formatEasterError ( EasterData.errorInvalidOffset , day ) end if offset < - 1 then return true , string.format ( "%d days" , offset ) elseif offset == - 1 then return true , "-1 day" elseif offset == 0 then return true , "" elseif offset == 1 then return true , "+1 day" else -- if offset > 1 then return true , string.format ( " + % d days" , offset ) end end local function loadEasterFormat ( fmt ) if fmt == EasterData.noFormat then return true , nil elseif not fmt then return true , EasterData . defaultFormat else return true , fmt end end --[[ НАЗНАЧЕНИЕ: Эта функция возвращает день и месяц пасхального воскресенья для указанного года и метода. ВХОДНЫЕ ДАННЫЕ: Год - любой год между 326 и 4099. Метод - 1 = исходный расчет на основе юлианского календаря 2 = исходный расчет с юлианской датой, преобразованной в эквивалентный григорианский календарь 3 = пересмотренный расчет на основе григорианского календаря 4 = пересмотренный расчет на основе мелетианского календаря ВЫХОДНЫЕ ДАННЫЕ: Нет. ВОЗВРАТЫ: 0, сообщение об ошибке - Ошибка; недопустимые аргументы месяц, день - месяц и день воскресенья ПРИМЕЧАНИЯ: Код переведен из источников DN OSP 6.4.0. Корни кода можно найти на http://www.gmarts.org/index.php?go=415 ОРИГИНАЛЬНЫЕ ПРИМЕЧАНИЯ: Этот алгоритм является арифметической интерпретацией 3-шагового метода датирования Пасхи, разработанного Роном Малленом в 1985 году, как значительное улучшение метода, описанного в Common Prayer Book Published Australian Almanac 1988 года. Обратитесь к этой публикации или библиотеке Канберры для четкого понимания используемого метода . Поскольку этот алгоритм является прямым переводом официальных таблиц, можно легко доказать, что он на 100% правильный. Это бесплатно! Пожалуйста, не изменяйте код или комментарии! ]] локальная функция calculateEasterDate ( year , method ) if year < 326 or year > 4099 then -- Пасхальные даты действительны для годов между 326 и 4099 -- Метод 2 должен поддерживать даты в июне после этого return 0 , formatEasterError ( EasterData.errorYearOutOfRange , year ) end if year < 1583 and method ~= 1 then -- Западная или православная Пасха действительна с 1583 года return 0 , formatEasterError ( EasterData.errorIncorrectMethod , year ) end if ( year < 1600 or year > 2400 ) and method ~= 4 then -- Пересмотренный юлианский календарь пока не поддерживается return 0 , formatEasterError ( EasterData.errorYearOutOfRange , year ) end -- промежуточный результат local firstDig = math.floor ( year / 100 ) local remain19 = year % 19 local temp = 0 -- результаты таблицы A - E local tA = 0 local tB = 0 local tC = 0 local tD = 0 local tE = 0 -- день пасхального воскресенья local d = 0 -- юлианский: if method == 1 or method == 2 then -- вычислить дату PFM tA = (( 225 - 11 * remain19 ) % 30 ) + 21 -- найти следующее воскресенье tB = ( tA - 19 ) % 7 tC = ( 40 - firstDig ) % 7 temp = year % 100 tD = ( temp + math.floor ( temp / 4 )) % 7 tE = (( 20 - tB - tC - tD ) % 7 ) + 1 d = tA + tE -- Восточная/православная: если метод == 2 then -- преобразовать юлианскую дату в григорианскую -- в григорианском календаре было пропущено 10 дней с 5 по 14 октября 1582 года temp = 10 -- только 1 из каждых 4 столетий является високосным годом в григорианском -- календаре (каждый век является високосным годом в юлианском календаре) if year > 1600 then temp = temp + firstDig - 16 - math.floor (( firstDig - 16 ) / 4 ) end d = d + temp end -- григорианский: elseif method == 3 или method == 4 then -- вычислить дату пасхального полнолуния (PFM) temp = math.floor (( firstDig - 15 ) / 2 ) + 202 - 11 * remain19 if firstDig > 26 then temp = temp - 1 end if firstDig > 38 then temp = temp - 1 end if firstDig == 21 или firstDig == 24 или firstDig == 25 или firstDig == 33 или firstDig == 36 или firstDig == 37 тогда temp = temp - 1 конец temp = temp % 30 tA = temp + 21 если temp == 29 тогда tA = tA - 1 конец если temp == 28 и remain19 > 10 тогда tA = tA - 1 конец -- найти следующее воскресенье tB = ( tA - 19 ) % 7 tC = ( 40 - firstDig ) % 4 if tC == 3 then tC = tC + 1 end if tC > 1 then tC = tC + 1 end temp = year % 100 tD = ( temp + math.floor ( temp / 4 )) % 7 tE = (( 20 - tB - tC - tD ) % 7 ) + 1 d = tA + tE else -- Неизвестный метод return 0 , formatEasterError ( EasterData . errorUnknownMethod , method ) end -- когда исходный расчет преобразуется в григорианский календарь, -- Пасхальное воскресенье может наступить в мае или даже в июне в далеком будущем if d > 92 then return 6 , d - 92 -- Июнь elseif d > 61 then return 5 , d - 61 -- Май elseif d > 31 then return 4 , d - 31 -- Апрель else return 3 , d -- Март конец конец локальная функция Easter ( args ) локальный ok локальный год ok , год = loadEasterYear ( args [ EasterData . argEasterYear ]) если не ok тогда вернуть год конец локальный метод ok , метод = loadEasterMethod ( args [ EasterData . argEasterMethod ], год ) если не ok тогда вернуть метод конец локальное смещение ok , offset = loadEasterOffset ( args [ EasterData.argEasterOffset ] ) если не ok , то вернуть смещение end local format ok , format = loadEasterFormat ( args [ EasterData.argEasterFormat ] ) если не ok , то вернуть формат end local month , day = calculateEasterDate ( year , method ) если month == 0 , то вернуть день end local result = string.format ( " % 04d-%02d-%02d % s " , year , month , day , offset ) если format then result = mw.language.getContentLanguage ( ) : formatDate ( format , result ) end return result end m [ EasterData.apiEaster ] = function ( frame ) return Easter ( frame.args ) end return m