Skip to content

Instantly share code, notes, and snippets.

@SynCap
Last active June 30, 2021 05:17
Show Gist options
  • Save SynCap/ad3a0fa6cae952c8d46dab9d4c243124 to your computer and use it in GitHub Desktop.
Save SynCap/ad3a0fa6cae952c8d46dab9d4c243124 to your computer and use it in GitHub Desktop.
Javascript & Typescript: calculate Orthodox Easter sacral dates | Дата Православной Пасхи и других дат Подвижного круга

Пасхалии / Orthodox Easter Dates (Javascript)

Рассчёт даты православной Пасхи и дат праздников Подвижного Круга, праздников, даты которых зависят от Пасхи

Calculate the Orthodox Easter date and other Easter depended dates

описание алгоритма / algorithm explanation -- https://ru.wikipedia.org/wiki/Пасха

function getEasterDate

Рассчёт даты пасхи на определённый год

Calculate Easter date for specified year

@link https://ru.wikipedia.org/wiki/Пасха#Расчёт_даты_Пасхи

@param year <Number> [=<this year>]	Год для которого ведётся рассчёт

@return 	   <Date>	Дата Пасхи указанного года по Григорианскому календарю

function getSacralDate

Gets the Easter depended sacral date.

Даты Подвижного круга - Масленица, Вербное воскресенье, Радуница, Вознесение, Троица

sacrality possible values / Доступныу значения для sacrality:

mas : Масленица и воскресеный день перед началом Великого Поста / Maslenitsa -- slavic native and Sunday before Quadragesima

ver : Вербное воскресенье (Вход в Иерусалим, пальмовое воскресенье) / Palm Sunday

rad : Радоница (Родительский день) / Radonitsa, slavic native

vos : Вознесение / Ascension Day

tro : Троица (Пятидесятница) / Holy Trinity Day

@param  {Date}   [easterDate=getEasterDate()]  The Easter date | Дата Пасхи

@param  {string} [sacrality='mas']          Type of sacral | Какой праздник

@return {Date}   The sacral date.

function rusifyDate

"Обчеловечивание" значения даты

Human (russian) friendly representation of date

@param      {Date}   date  The date | Дата, которую по-русски посмотреть надо

@return     {String}       String representing the date | Дата по-человечячьи

Пример применения

function getAllSacralDates

Gets all sacral dates for specified/current year.

Рассчитать все даты Подвижного круга на указанный/текущий год.

@param      {Number}  [year=(new Date).getFullYear()]  The year

@return     {Object}  All sacral dates.

function getAllSacralDatesRange

Gets all sacral dates by years range.

Рассчитать даты Подвижного Круга для нескольких лет.

@param      {Number}  [yearSince=(new Date()).getFullYear()-20]  The year since

@param      {Number}  [yearTill=(new Date()).getFullYear()]      The year till

@return     {Object}  All sacral dates by years.
/**
* Рассчёт даты православной Пасхи и дат праздников Подвижного Круга,
* праздников, даты которых зависят от Пасхи
*
* Calculate the Orthodox Easter date and other Easter depended dates
*
* описание алгоритма -- https://ru.wikipedia.org/wiki/Пасха
*
* @link https://ru.wikipedia.org/wiki/Пасха#Расчёт_даты_Пасхи
*
* @param year <Number> [=<this year>] Год для которого ведётся рассчёт
* @return <Date> Дата Пасхи указанного года по Григорианскому календарю
*/
function getEasterDate(year = (new Date()).getFullYear()) {
// Базовый коэффициент учитывающий Золотое Число и фазу луны
let a = (19*(year%19) + 15) % 30
// поправка на високосный год
let b = ((2*(year%4) + 4*(year%7) + 6*a + 6) % 7)
let res = (a + b > 10)
? new Date(year, 3, a + b - 9)
: new Date(year, 2, 22 + a + b)
res.setDate(res.getDate() + 13); // Юлианская дата --> Григорианская
return res
}
/**
* Gets the Easter depended sacral date.
*
* Даты Подвижного круга - Масленица, Вербное воскресенье, Радуница,
* Вознесение, Троица
*
* @param {Date} [easterDate=getEasterDate()] The Easter date | Дата Пасхи
* @param {string} [sacrality='mas'] Type of sacral | Какой праздник
* @return {Date} The sacral date.
*/
function getSacralDate(easterDate = getEasterDate(), sacrality = 'mas') {
const sacralDiffs = {
// Масленица и воскресеный день перед началом Великого Поста
// Maslenitsa -- slavic native and Sunday before Quadragesima
'mas' : -49,
// Вербное воскресенье (Вход в Иерусалим, пальмовое воскресенье)
// Palm Sunday
'ver' : -7,
// Радоница (Родительский день)
// Radonitsa, slavic native
'rad' : +9,
// Вознесение
// Ascension Day
'vos' : +40,
// Троица (Пятидесятница)
// Holy Trinity Day
'tro' : +50
}
return new Date(easterDate)
.setDate(easterDate.getDate() + sacralDiffs[sacrality])
}
/**
* "Обчеловечивание" значения даты
*
* Human (russian) friendly representation of date
*
* @param {Date} date The date | Дата, которую по-русски посмотреть надо
* @return {String} String representing the date | Дата по-человечячьи
*/
function rusifyDate(date) {
return new Date(date).toLocaleDateString(
'ru-RU',
{
weekday: 'short',
day: 'numeric',
month: 'long'
}
)
}
/******************************************************************************/
/**
* @example
*/
/**
* Gets all sacral dates for specified/current year.
* Рассчитать все даты Подвижного круга на указанный/текущий год.
*
* @param {Number} [year=(new Date).getFullYear()] The year
* @return {Object} All sacral dates.
*/
function getAllSacralDates(year = (new Date).getFullYear()) {
// локально облегчим себе чтение кода
let sacr = getSacralDate
let rus = rusifyDate
let eDate = getEasterDate(year)
return {
'Масленица': rus(sacr(eDate)),
'Вербное': rus(sacr(eDate,'ver')),
'Пасха': rus(eDate),
'Радуница': rus(sacr(eDate,'rad')),
'Вознесение': rus(sacr(eDate,'vos')),
'Троица': rus(sacr(eDate,'tro'))
}
}
/**
* Gets all sacral dates by years range.
* Рассчитать даты Подвижного Круга для нескольких лет.
*
* @param {Number} [yearSince=(new Date()).getFullYear()-20] The year since
* @param {Number} [yearTill=(new Date()).getFullYear()] The year till
* @return {Object} All sacral dates by years.
*/
function getAllSacralDatesRange(
yearSince = (new Date()).getFullYear()-20,
yearTill = (new Date()).getFullYear()
) {
let res = {}
for (let year = 2000; year <= 2030; year++) {
res[year] = getAllSacralDates(year)
}
return res
}
/******************************************************************************/
console.log('\x1bc') // clear screen in Node REPL
console.clear() // clear console in browsers' devtools
console.table(getAllSacralDates())
console.table(getAllSacralDatesRange())
/**
* Рассчёт даты православной Пасхи и дат праздников Подвижного Круга,
* праздников, даты которых зависят от Пасхи
*
* Calculate the Orthodox Easter date and other Easter depended dates
*
* описание алгоритма -- https://ru.wikipedia.org/wiki/Пасха
*
* @link https://ru.wikipedia.org/wiki/Пасха#Расчёт_даты_Пасхи
*
* @param year <Number> [=<this year>] Год для которого ведётся рассчёт
* @return <Date> Дата Пасхи указанного года по Григорианскому календарю
*/
function getEasterDate(year : number = (new Date()).getFullYear()) : Date {
// Базовый коэффициент учитывающий Золотое Число и фазу луны
let a = (19*(year%19) + 15) % 30
// поправка на високосный год
let b = ((2*(year%4) + 4*(year%7) + 6*a + 6) % 7)
let res = (a + b > 10)
? new Date(year, 3, a + b - 9)
: new Date(year, 2, 22 + a + b)
res.setDate(res.getDate() + 13); // Юлианская дата --> Григорианская
return res
}
/**
* Gets the Easter depended sacral date.
*
* Даты Подвижного круга - Масленица, Вербное воскресенье, Радуница,
* Вознесение, Троица
*
* @param {Date} [easterDate = getEasterDate()] The Easter date | Дата Пасхи
* @param {string} [sacrality = 'mas'] Type of sacral | Какой праздник
* @return {Date} The sacral date.
*/
function getSacralDate(easterDate : Date = getEasterDate(), sacrality : 'mas'|'ver'|'rad'|'vos'|'tro' = 'mas') : Date {
const sacralDiffs = {
// Масленица и воскресеный день перед началом Великого Поста
// Maslenitsa -- slavic native and Sunday before Quadragesima
'mas' : -49,
// Вербное воскресенье (Вход в Иерусалим, пальмовое воскресенье)
// Palm Sunday
'ver' : -7,
// Радоница (Родительский день)
// Radonitsa, slavic native
'rad' : +9,
// Вознесение
// Ascension Day
'vos' : +40,
// Троица (Пятидесятница)
// Holy Trinity Day
'tro' : +50
}
// const sacralDate = new Date(easterDate)
easterDate.setDate(easterDate.getDate() + sacralDiffs[sacrality]);
return easterDate
}
/**
* "Обчеловечивание" значения даты
*
* Human (russian) friendly representation of date
*
* @param {Date} date The date | Дата, которую по-русски посмотреть надо
* @return {String} String representing the date | Дата по-человечячьи
*/
function rusifyDate(date : Date) : string {
return date.toLocaleDateString(
'ru-RU',
{
weekday: 'short',
day: 'numeric',
month: 'long'
}
)
}
/******************************************************************************/
/**
* @example
*/
/**
* Gets all sacral dates for specified/current year.
* Рассчитать все даты Подвижного круга на указанный/текущий год.
*
* @param {Number} [year=(new Date).getFullYear()] The year
* @return {Object} Bunch of sacral dates
*/
function getAllSacralDates(year : number = (new Date).getFullYear()) : Object {
let eDate = getEasterDate(year)
return {
'Масленица' : rusifyDate(getSacralDate(eDate)),
'Вербное' : rusifyDate(getSacralDate(eDate, 'ver')),
'Пасха' : rusifyDate(eDate),
'Радуница' : rusifyDate(getSacralDate(eDate, 'rad')),
'Вознесение' : rusifyDate(getSacralDate(eDate, 'vos')),
'Троица' : rusifyDate(getSacralDate(eDate, 'tro'))
}
}
/**
* Gets all sacral dates by years range.
* Рассчитать даты Подвижного Круга для нескольких лет.
*
* @param {Number} [yearSince=(new Date()).getFullYear() - 5] The year since
* @param {Number} [yearTill=(new Date()).getFullYear() + 10] The year till
* @return {Object} All sacral dates by years.
*/
function getAllSacralDatesRange(
yearSince : number = (new Date()).getFullYear() - 5,
yearTill : number = (new Date()).getFullYear() + 10
) : Object {
let res = {} as Record<number, object>
for (let year = yearSince; year <= yearTill; year++) {
res[year] = getAllSacralDates(year)
}
return res
}
/******************************************************************************/
console.log('\x1bc') // clear screen in Node REPL
console.clear() // clear console in browsers' devtools
console.table(getAllSacralDates())
console.table(getAllSacralDatesRange())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment