Исходники команд конвертирования дат

Решил на этой странице разместить алгоритмы конвертирования и вычисления дат. Но, увы, Лень победила мои Желания. Поэтому разместил только тексты на языке JavaScript c минимальным количеством комментарий. И буду искренне рад, если кто-нибудь воспользуется информацией с этой web-страницы.

Все расчеты в календаре производятся с применением Юлианского Дня (JD), который предствляет собой количество дней Юлианского календаря (в виде целой и дробной части), прошедших от начала Юлианской эпохи - полудня понедельника 1 января 4713 г до нашей эры.

Почти все расчеты в календаре производятся для времени по Гринвичу (GMT).

Для получения остатка от целочисленного деления используется оператор % (a % b), а не для нецелых чисел - функция mod:

function mod(a, b) { return a - (b * Math.floor(a / b)); }

Реализовать все команды на PHP проще, так как существуют функции для работы с Юлианским Днём: gregoriantojd() (Преобразует дату по григорианскому календарю в количество дней в юлианском летоисчислении). cal_from_jd() (Преобразует дату, заданную в юлианском календаре, в дату указанного календаря). jdtogregorian() (Переводит число дней в юлианском летоисчислении в дату по Григорианскому календарю). cal_to_jd() (Преобразует заданную дату в юлианскую). jdtounix() (Переводит число дней в юлианском летоисчислении в метку времени Unix). unixtojd() (Переводит метку времени Unix в юлианский день) и другие...

.

Оглавление

Григориа́нский календа́рь

Григориа́нский календа́рь — система исчисления времени, основанная на циклическом обращении Земли вокруг Солнца. Средняя продолжительность года принята равной 365,2425 суток; содержит 97 високосных лет на 400 лет.

Впервые григорианский календарь был введён папой римским Григорием XIII в католических странах 15 октября 1582 года взамен прежнего юлианского: следующим днём после четверга 4 октября стала пятница 15 октября. Григорианский календарь используется в большинстве государств и стран мира. В литературе также применяется название — «новый стиль».

Функция «Проверить год на високосность»:

function leap_gregorian(year) {
   return ((year % 4) == 0) &&  (!(((year % 100) == 0) && ((year % 400) != 0))); 
 }

Функция «Вычисление Юлианского дня»:

var GREGORIAN_EPOCH = 1721425.5;  // Юлианский день на 1 января 0001 г. 0 час.

function gregorian_to_jd (year, month, day) {      /*
   year - год (от -4712 до 9999), month - месяц (1-12), day - день (1-31)
   день может содержать дробную часть.  Например: 
   Вычисление JD для даты 4 Октября 1957 в 19:28:34 по Гринвичу, 
   времени запуска первого искусственного спутника Земли
   gregorian_to_jd(1957,10,19.8115) => 2436116.31151  */
   
  let y  = year - 1, 
      mm  = month <= 2 ? 0 : leap_gregorian(year) ? -1 : -2;

  return (GREGORIAN_EPOCH - 1) + 365*y + 
         Math.floor(y/4) - 
         Math.floor(y/100) + 
         Math.floor(y/400) + 
         Math.floor( (367*month - 362) / 12 ) + 
         mm + day;
  }

Функция «Вычисление календарной даты по Юлианскому дню»:

function jd_to_gregorian(jd) { 
  let wjd, depoch, quadricent, dqc, cent, dcent, quad, dquad,  
      yindex, dyindex, year, yearday, leapadj;

  wjd = Math.floor(jd - 0.5) + 0.5;
  depoch = wjd - GREGORIAN_EPOCH; 
  quadricent = Math.floor(depoch / 146097); 
  dqc = mod(depoch, 146097);
  cent = Math.floor(dqc / 36524); 
  dcent = mod(dqc, 36524); 
  quad = Math.floor(dcent / 1461); 
  dquad = mod(dcent, 1461);
  yindex = Math.floor(dquad / 365); 

  year = (quadricent * 400) + (cent * 100) + (quad * 4) + yindex;
  if (!((cent == 4) || (yindex == 4))) { year++;}

  yearday = wjd - gregorian_to_jd(year, 1, 1); 
  leapadj = ((wjd < gregorian_to_jd(year, 3, 1)) ? 0 : (leap_gregorian(year) ? 1 : 2) );

  month = Math.floor((((yearday + leapadj) * 12) + 373) / 367); 

  day = (wjd - gregorian_to_jd(year, month, 1)) + 1;

  return new Array(year, month, day);
 }

Функция «Получить Часы,минуты, секунды»:

function jdhms(jd) { 
  jd += 0.5
  let a = ((jd - Math.floor(jd)) * 86400.0) + 0.5;
  let hour = Math.floor(a / 3600),
      min  = Math.floor( (a/60) % 60),
      sec  = Math.floor(a % 60);
  return new Array( hour, min, sec );
}

Интервал между датами

Число дней между двумя датами может быть найдено при помощи разности соответствующих значений Юлианских дней.

День недели

День недели, соответствующий заданной дате, может быть рассчитан следующим образом. Нужно вычислить JD для этой даты в 0ч, добавить 1.5, затем поделить результат на 7. Остаток от деления будет соответствовать дню недели, а именно: 0 — воскресенье, 1 — понедельник, 2 — вторник, 3 — среда, 4 — четверг, 5 — пятница, 6 — суббота.

function jwday(jd) { return mod( Math.floor( (jd  + 1.5)), 7); }

День года

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

function yearday(year, month, day) {
  let K = month <= 2 ? 0 : leap_gregorian(year) ? -1 : -2;
  return Math.floor( (367*month - 362) / 12 ) + K + day;
 }

где year - год, month – номер месяца, day – день месяца

Расчет католической пасхи

function pkat(year)
 {var G,C,X,Z,D,E,N,m,d;
  G = year%19 + 1;   
  C = Math.floor(year / 100) + 1;   
  X = Math.floor((3*C) / 4) - 12;
  Z = Math.floor((8*C + 5) / 25) - 5;   
  D = Math.floor((5*year) / 4) - X - 10;   
  E = (11*G + 20 + Z - X) % 30;
  if (E == 24 || (E == 25 && G > 11)) E++;
  N = 44 - E;
  if (N < 21) N += 30;
  N = N + 7 - ((D + N) % 7);
  if (N > 31) {d = N - 31; m = 4;}
  else {m = 3; d = N;}
  return new Array(year,m,d);
 }

Юлианский календарь

Разница между юлианским и григорианским календарями постоянно увеличивается из-за разных правил определения високосных годов: в юлианском календаре високосными являются все годы, кратные 4, тогда как в григорианском календаре год является високосным, если он кратен 400, либо кратен 4 и при этом не кратен 100. Скачок происходит в завершающий год века.
Подробнее...

Функция «Проверить год на високосность»:

function leap_julian(year) { return mod(year, 4) == ((year > 0) ? 0 : 3); }

Функция «Вычисление Юлианского дня»:

var JULIAN_EPOCH = 1721423.5;  // Юлианский день на 1 января 0001 г. 0 час.

function julian_to_jd (year, month, day) {         /*
   year - год (от -4712 до 9999), month - месяц (1-12), day - день (1-31)
   день может содержать дробную часть. */
   
  let y = year < 1 ? (year+1) : year;
  if (month <= 2) { y--;  month += 12;  }
  return ( (Math.floor( (365.25 * (y + 4716)  ) ) + 
            Math.floor( 30.6001 * (month + 1) ) ) + 
            day - 1524.5);
}

Функция «Вычисление календарной даты по Юлианскому дню»:

function jd_to_julian(jd) {
    let z, a, alpha, b, c, d, e, year, month, day;
    jd += 0.5;
    z = Math.floor(jd);
    a = z;
    b = a + 1524;
    c = Math.floor((b - 122.1) / 365.25);
    d = Math.floor(365.25 * c);
    e = Math.floor((b - d) / 30.6001);
    month = Math.floor((e < 14) ? (e - 1) : (e - 13));
    year = Math.floor((month > 2) ? (c - 4716) : (c - 4715));        
    if (year < 1) { year--; }
 /*       Если год меньше 1, вычитаем единицу, чтобы преобразовать из
         система дат с нулевым отсчетом к системе общей эры в
         в котором за годом -1 (1 г. до н. э.) следует год 1 (1 г. н. э.). 
 */
    day = b - d - Math.floor(30.6001 * e);

    return new Array(year, month, day);
}

Для получении разницы между юлианским и григорианским календарями можно воспользоваться формулой:

julian_to_jd (year, month, day) - gregorian_to_jd (year, month, day);

Расчет православной пасхи

function pprav(year)
 {var a,b,d,m;
  a = (19 * (year % 19) + 15) % 30;  
  b = (2 * (year % 4) + 4 * (year %7 ) + 6 * a + 6) % 7;
  if ( (a + b) > 9) {m = 4; d = a + b - 9;}  
  else {m = 3; d = 22 + a + b;}
  return jd_to_gregorian(julian_to_jd(year,m,d));
 }

Еврейский календарь

Еврейский календарь — ежегодный календарь евреев, официальный календарь в Израиле (наряду с григорианским). По этому календарю празднуют еврейские праздники, читают соответствующие части Торы в синагогах, отмечают дни рождения и дни памяти умерших родственников, проставляют даты на официальных и коммерческих документах. Календарь является лунно-солнечным, благодаря этому каждая календарная дата всегда приходится не только на один и тот же сезон года, но и на одну и ту же фазу луны. Месяцы начинаются только в новолуние, как и Еврейский Новый год. Еврейская Пасха — всегда в полнолуние в начале весны.
Подробнее...

var HEBREW_EPOCH = 347995.5;  // Юлианский день на 5 сентября -3760 г. 0 час.

// Наименования месяцев:
var HEBREW_hmonth = ["Нисан", "Ияр", "Сиван", "Таммуз", "Ав", "Элул", "Тишрей", 
                     "Хешван", "Кислев", "Тевет", "Шват", "Адар", "Адар Бет"];

Функция «Проверить год на високосность»:

function hebrew_leap(year) { return mod(( (year * 7) + 1), 19) < 7;} }

Вспомогательные функции

//  Сколько месяцев в еврейском году (12 = обычный, 13 = високосный)
function hebrew_year_months(year) { return hebrew_leap(year) ? 13 : 12; }


// Проверка на задержку начала нового года для того, 
// чтобы новый год не начинался в воскресенье, среду и пятницу.
function hebrew_delay_1(year)
{ var months = Math.floor(((235 * year) - 234) / 19),
      parts = 12084 + (13753 * months),
      day = (months * 29) + Math.floor(parts / 25920);

   if (mod((3 * (day + 1)), 7) < 3) { day++; }
   return day;
}

//  Проверка на задержку начала нового года из-за продолжительности соседних лет
function hebrew_delay_2(year)
{ var last = hebrew_delay_1(year - 1),
      present = hebrew_delay_1(year),
      next = hebrew_delay_1(year + 1);
  return ((next - present) == 356) ? 2 : (((present - last) == 382) ? 1 : 0);
}

//  Сколько дней в еврейском году?
function hebrew_year_days(year)
  {  return hebrew_to_jd(year + 1, 7, 1) - hebrew_to_jd(year, 7, 1); }

// Сколько дней в данном месяце данного года
function hebrew_month_days(year, month)
{   // // Прежде всего, избавится от 29-дневных месяцев фиксированной длины
    if (month == 2 || month == 4 || month == 6 ||
        month == 10 || month == 13) {
        return 29;
    }
//  Если год не високосный, то в Адаре 29 дней.
    if (month == 12 && !hebrew_leap(year)) { return 29; }

//  Если это Хешван, дни зависят от продолжительности года.
    if (month == 8 && !(mod(hebrew_year_days(year), 10) == 5)) {  return 29; }

//  Точно так же Кислев меняется в зависимости от продолжительности года.
    if (month == 9 && (mod(hebrew_year_days(year), 10) == 3)) { return 29; }

// Нет, это 30-дневный месяц
    return 30;
}

Функция «Вычисление Юлианского дня»:

function hebrew_to_jd(year, month, day)
{ var jd, mon, months;
    months = hebrew_year_months(year);
    jd = HEBREW_EPOCH + hebrew_delay_1(year) +
         hebrew_delay_2(year) + day + 1;

    if (month < 7) {
        for (mon = 7; mon <= months; mon++) {
            jd += hebrew_month_days(year, mon);
        }
        for (mon = 1; mon < month; mon++) {
            jd += hebrew_month_days(year, mon);
        }
    } else {
        for (mon = 7; mon < month; mon++) {
            jd += hebrew_month_days(year, mon);
        }
    }

    return jd;
}

Функция «Вычисление Еврейской календарной даты по Юлианскому дню»:

function jd_to_hebrew(jd)
{ var year, month, day, i, count, first;
    jd = Math.floor(jd) + 0.5;
    count = Math.floor(((jd - HEBREW_EPOCH) * 98496.0) / 35975351.0);
    year = count - 1;
    for (i = count; jd >= hebrew_to_jd(i, 7, 1); i++) {
        year++;
    }
    first = (jd < hebrew_to_jd(year, 1, 1)) ? 7 : 1;
    month = first;
    for (i = first; jd > hebrew_to_jd(year, i, hebrew_month_days(year, i)); i++) {
        month++;
    }
    day = (jd - hebrew_to_jd(year, month, 1)) + 1;
    return new Array(year, month, day);
}

Расчет еврейской пасхи

function Pesach(year) 
 { var jdb = gregorian_to_jd(year, 1, 1),
       jdk = gregorian_to_jd(year, 12, 31);
   var b = jd_to_hebrew(jdb),
       Y=b[0],
       y,jd;
   for (y=Y; ;y++) 
    { jd=hebrew_to_jd(y,1,15); 
      if (jd>=jdb && jd<=jdk) return jd_to_gregorian(jd);
    }
 }

Функция возвращает дату еврейской пасхи в виде массива [год,месяц,день]

Исламский календарь

Мусульманский (Исламский) календарь — лунный календарь, используемый в исламе для определения дат религиозных праздников, а также как официальный календарь в некоторых мусульманских странах. Летоисчисление ведётся от Хиджры (16 июля 622 года н. э.) — даты переселения пророка Мухаммада и первых мусульман из Мекки в Медину.
Подробнее...

var ISLAMIC_EPOCH = 1948439.5;  // Юлианский день на 19 июля 622 г. 0 час.
// Наименования месяцев:
var ISLAMIC_month = ["Мухаррам", "Сафар", "Рабии`у ль-Авваль", "Рабии`у с-Саании", "Джумаада ль-Ууля", "Джумаада с-Саании", 
                     "Раджаб", "Шаабан", "Рамадан", "Шавваль", "Зуль-Ка`да", "Зуль-Хиджжа"];
// Наименования дней недели:
var ISLAMIC_WEEKDAYS = ["Йаум аль-ахад", "Йаум аль-иснайн","Йаум ас-саласа'", "Йаум аль-арба''а", 
                        "Йаум аль-хамис", "Йаум аль-джум''а", "Йаум ас-сабт"];

Функция «Проверить год на високосность»:

function leap_islamic(year) { return (((year * 11) + 14) % 30) < 11; }

Функция «Вычисление Юлианского дня из исламской даты»:

function islamic_to_jd(year, month, day) 
  { return day + Math.ceil(29.5 * (month - 1)) + 
           (year - 1) * 354 + 
           Math.floor( (3 + (11 * year)) / 30) + 
           ISLAMIC_EPOCH - 1; 
  }

Функция «Рассчитать исламскую дату из Юлианского дня»:

function jd_to_islamic(jd)
{   var year, month, day;
    jd = Math.floor(jd) + 0.5;
    year = Math.floor(((30 * (jd - ISLAMIC_EPOCH)) + 10646) / 10631);
    month = Math.min(12, Math.ceil((jd - (29 + islamic_to_jd(year, 1, 1))) / 29.5) + 1);
    day = (jd - islamic_to_jd(year, month, 1)) + 1;
    return new Array(year, month, day);
}

Персидский календарь

Иранский (Персидский) календарь или Солнечная хиджра — астрономический солнечный календарь, который используется в качестве официального календаря в Иране и Афганистане. Календарь был разработан при участии Омара Хайяма, и с тех пор несколько раз уточнялся. Он ведёт летосчисление от хиджры (переселение пророка Мухаммада из Мекки в Медину в 622 году, но основывается на солнечном (тропическом) годе, в отличие от классического исламского календаря, поэтому его месяцы всегда приходятся на одни и те же времена года. Начало года — день весеннего равноденствия (Навруз, праздник весны).
Подробнее...

var PERSIAN_EPOCH = 1948320.5;  // Юлианский день на 22 марта 622 г. 0 час.
// Наименования месяцев:
var PERSIAN_month = ["Фарвардин", "Ордибехешт", "Хордад", "Тир", "Мордад", "Шахривар", 
                     "Мехр", "Абан", "Азар", "Дей", "Бахман", "Эсфанд"];
// Наименования дней недели:
var PERSIAN_WEEKDAYS = ["Йекшанбе", "Душанбе","Сешанбе", "Чахаршанбе", "Панджшанбе", "Джоме", "Шанбе"];

Функция «Проверить год на високосность»:

function leap_persian(year) {
   return ((((((year - ((year > 0) ? 474 : 473)) % 2820) + 474) + 38) * 682) % 2816) < 682;
 }

Функция «Вычисление Юлианского дня из персидской даты»:

function persian_to_jd(year, month, day)
{    var epbase, epyear;
    epbase = year - ((year >= 0) ? 474 : 473);
    epyear = 474 + mod(epbase, 2820);
    return day + 
           ((month <= 7) ? ((month - 1) * 31) : (((month - 1) * 30) + 6)) + 
            Math.floor(((epyear * 682) - 110) / 2816) + 
            (epyear - 1) * 365 + 
            Math.floor(epbase / 2820) * 1029983 + 
            (PERSIAN_EPOCH - 1);
}

Функция «Рассчитать персидскую дату из Юлианского дня»:

function jd_to_persian(jd)
{   var year, month, day, depoch, cycle, cyear, ycycle, aux1, aux2, yday;
    jd = Math.floor(jd) + 0.5;
    depoch = jd - persian_to_jd(475, 1, 1);
    cycle = Math.floor(depoch / 1029983);
    cyear = mod(depoch, 1029983);
    if (cyear == 1029982) {ycycle = 2820;} 
    else 
      { aux1 = Math.floor(cyear / 366);
        aux2 = mod(cyear, 366);
        ycycle = Math.floor(((2134 * aux1) + (2816 * aux2) + 2815) / 1028522) +  aux1 + 1;
      }
    year = ycycle + (2820 * cycle) + 474;
    if (year <= 0) { year--; }
    yday = (jd - persian_to_jd(year, 1, 1)) + 1;
    month = yday <= 186 ? Math.ceil(yday / 31) : Math.ceil((yday - 6) / 30);
    day = (jd - persian_to_jd(year, month, 1)) + 1;
    return new Array(year, month, day);
}

Славяно-Арийский Календарь

Древним Славянским Календарём называют Славяно-Арийский Календарь (Ведический), летоисчисление которого начинается с Сотворения Мира в Звёздном Храме.

Другое название Календаря — (Даарийский) Круголет Числобога (ДКЧ).
Подробнее...

Таблица. Даарийский Круголет Числобога (Круг Жизни)

var sstb1=[0,
[1,1,0,0,23], [1,2,5,0,23], [2,3,1,0,23], [2,4,6,1,23], [3,5,2,2,22], [3,6,7,2,22], [4,7,3,2,22], [4,8,8,3,22], [5,9,4,4,21], [5,10,0,4,21],  //10
[6,11,5,4,21],[6,12,1,5,21],[7,13,6,6,20],[7,14,2,6,20],[8,15,7,6,20],[8,16,3,7,20],[9,1,3,0,23], [9,2,8,0,23], [1,3,4,0,23], [1,4,0,1,23],   //20
[2,5,5,2,22], [2,6,1,2,22], [3,7,6,2,22], [3,8,2,3,22], [4,9,7,4,21], [4,10,3,4,21],[5,11,8,4,21],[5,12,4,5,21],[6,13,0,6,20],[6,14,5,6,20],  //30
[7,15,1,6,20],[7,16,6,7,20],[8,1,6,0,23], [8,2,2,0,23], [9,3,7,0,23], [9,4,3,1,23], [1,5,8,2,22], [1,6,4,2,22], [2,7,0,2,22], [2,8,5,3,22],   //40
[3,9,1,4,21], [3,10,6,4,21],[4,11,2,4,21],[4,12,7,5,21],[5,13,3,6,20],[5,14,8,6,20],[6,15,4,6,20],[6,16,0,7,20],[7,1,0,0,23], [7,2,5,0,23],   //50
[8,3,1,0,23], [8,4,6,1,23], [9,5,2,2,22], [9,6,7,2,22], [1,7,3,2,22], [1,8,8,3,22], [2,9,4,4,21], [2,10,0,4,21],[3,11,5,4,21],[3,12,1,5,21],  //60
[4,13,6,6,20],[4,14,2,6,20],[5,15,7,6,20],[5,16,3,7,20],[6,1,3,0,23], [6,2,8,0,23], [7,3,4,0,23], [7,4,0,1,23], [8,5,5,2,22], [8,6,1,2,22],   //70
[9,7,6,2,22], [9,8,2,3,22], [1,9,7,4,21], [1,10,3,4,21],[2,11,8,4,21],[2,12,4,5,21],[3,13,0,6,20],[3,14,5,6,20],[4,15,1,6,20],[4,16,6,7,20],  //80
[5,1,6,0,23], [5,2,2,0,23], [6,3,7,0,23], [6,4,3,1,23], [7,5,8,2,22], [7,6,4,2,22], [8,7,0,2,22], [8,8,5,3,22], [9,9,1,4,21], [9,10,6,4,21],  //90
[1,11,2,4,21],[1,12,7,5,21],[2,13,3,6,20],[2,14,8,6,20],[3,15,4,6,20],[3,16,0,7,20],[4,1,0,0,23], [4,2,5,0,23], [5,3,1,0,23], [5,4,6,1,23],  //100
[6,5,2,2,22], [6,6,7,2,22], [7,7,3,2,22], [7,8,8,3,22], [8,9,4,4,21], [8,10,0,4,21],[9,11,5,4,21],[9,12,1,5,21],[1,13,6,6,20],[1,14,2,6,20], //110 
[2,15,7,6,20],[2,16,3,7,20],[3,1,3,0,23], [3,2,8,0,23], [4,3,4,0,23], [4,4,0,1,23], [5,5,5,2,22], [5,6,1,2,22], [6,7,6,2,22], [6,8,2,3,22],  //120
[7,9,7,4,21], [7,10,3,4,21],[8,11,8,4,21],[8,12,4,5,21],[9,13,0,6,20],[9,14,5,6,20],[1,15,1,6,20],[1,16,6,7,20],[2,1,6,0,23], [2,2,2,0,23],  //130
[3,3,7,0,23], [3,4,3,1,23], [4,5,8,2,22], [4,6,4,2,22], [5,7,0,2,22], [5,8,5,3,22], [6,9,1,4,21], [6,10,6,4,21],[7,11,2,4,21],[7,12,7,5,21], //140
[8,13,3,6,20],[8,14,8,6,20],[9,15,4,6,20],[9,16,0,7,20] ];

Каждое лето в таблице описывается 5 элементами:

a0 - №№ элементов в массивах AryanNames.element (стихии) и 
                   AryanNames.color (цвета)
a1 - № Лета в круге Лет (1 - 16)
a2 - День Недели, с которого начинаются Лето Круголета - 1
a3 - № в таблицe sstb2
a4 - День в сентябре, с которого начинаеися Лето

Таблица Соответствия дней Григорианского календаря на начало каждого Сороковника Славяно-Арийского календаря

   1     2      3    4   5      6    7    6     9    1       Круголѣт  
var sstb2 = [
 [923, 1103,  1213, 123, 304,  414, 524, 704,  813, 923 ],  // 1 - 3
 [923, 1103,  1213, 123, 303,  413, 523, 703,  812, 922 ],  // 4
 [922, 1102,  1212, 122, 303,  413, 523, 703,  812, 922 ],  // 5 - 7
 [922, 1102,  1212, 122, 302,  412, 522, 702,  811, 921 ],  // 8
 [921, 1101,  1211, 121, 302,  412, 522, 702,  811, 921 ],  // 9 - 11
 [921, 1101,  1211, 121, 301,  411, 521, 701,  810, 920 ],  // 12
 [920, 1031,  1210, 120, 301,  411, 521, 701,  810, 920 ],  // 13 - 15
 [920, 1031,  1211, 121, 302,  412, 523, 703,  813, 923 ]];  // 16

Объект наименований

var AryanNames={
  element:['Земля','Звезда','Огонь','Солнце','Дерево','Свага','Океан','Луна','Бог'],
  color:['Черный','Красный','Алый','Златый','Зеленый','Небесный','Синий','Фиолетовый','Белый'],
  kruglet:['Странник (Путь)','Жрец','Жрица (Дева)','Мир (Явь)','Свиток','Феникс','Лис (Навь)','Дракон','Змей','Олел','Дельфин','Конь','Пес','Тур (Бык)','Хоромы (Дом)','Капище (Храм)'],
  week:['Понедельникъ','Вторникъ','Тритейникъ','Четверикъ','Пятница','Шестица','Седьмица','Осьмица','Неделя'],
  month:['Рамхатъ','Айлетъ','Бейлетъ','Гэйлетъ','Дайлетъ','Элетъ','Вэйлетъ','Хейлетъ','Тайлетъ'],
  tree:['Яблоня','Груша','Слива','Сосна','Липа','Лиственница','Малина, Бук','Ива','Тополь','Смородина, Граб','Осина','Берёза','Вишня','Папоротник, Вяз','Дуб','Ясень, Игг'],
  patron:['Джива','Рамхат','Рожана','Макошь','Семаргл','Варуна','Сварог','Род','Велес','Марена','Крышень','Лада','Вышень','Купала','Перун','Тарх Даждьбог'],
  chertog:['Дева','Вепрь','Щука','Лебедь','Змей','Ворон','Медведь','Бусел','Волк','Лиса','Тур','Лось','Финист','Конь','Орёл','Рас']};

Глобальные переменные

var D00 = 18,                                   // Начало суток
    M00 = D00*60,                               // Начало суток в минутах
    LetoCicleLife=1,                            // Лето в круге Жизни
    ssadmes = [0,41,81,122,162,203,243,284,324]; // Начало каждого Сороковника

Если в регионе существует летнее время, необходимо включить проверку:
Если Летнее Время, то { D00 = 19, M00 = 1140 }
Иначе { D00 = 18, M00 = 1080 }

Вспомогательные функции

// определить № Лета LetoCicleLife=1;
function sscf1 (y) {let i=mod((y-32),144); LetoCicleLife = i==0 ? 144 : i; return LetoCicleLife;}

// Получить массив-строку из таблицы Соответствия дней Григорианского календаря на начало каждого месяца Славяно-Арийского календаря
function sscf2 (x,y) {let i=sscf1(y); j=sstb1[i][3]; return x >= sstb2[j][9] ? sstb1[i] : null;}

Функия перевода даты из Григорианского календаря в Славяно-Арийский

Форматы вызова:

gregorian_to_sscal (year,month,day,hour=0,minutes=0)
gregorian_to_sscal (year,month,day,hour=0)
gregorian_to_sscal (year,month,day)
gregorian_to_sscal (jd,minutes=0)
gregorian_to_sscal (jd,min=0)

Параметры: year - Год month - Месяц ( 1 - 12 ) day - День ( 1 - 31) hour - Часы ( 0 - 23) minutes - Минуты ( 0 - 59) min - Минуты с начала суток ( 0 - 1439 ) jd - Юлианский день

function gregorian_to_sscal (year,month,day,hour=0,minutes=0) { var jd,JD,a,d,i,y,x,t,Ys,m,n,b,i,nd,dn;
  if(arguments.length<3) { 
     jd = year; JD = jd;
     if (arguments.length==2) { hour = Math.floor(month/60); minutes = month % 60; }
     a = jd_to_gregorian(jd); 
     year = a[0]; month = a[1]; day = a[2]; }
  else {jd= gregorian_to_jd(year, month, day); JD = jd;}

  var gr = {year:year, month:month, day:day,time:('0'+hour).slice(-2) + ':' + ('0'+minutes).slice(-2)};

  if (hour>=D00) {jd++; a = jd_to_gregorian(jd); year = a[0]; month = a[1]; day = a[2]; }

  Ys = year + 5508;
  x =  month*100 + day;
  y =  year;
  if  ( x > 919 && (a = sscf2(x,Ys+1))!=null)  Ys++;
  else { i = sscf1(Ys); a = sstb1[i]; }

  b = sstb2[a[3]];
  if (x < b[3]) {y--; m = 2;}
  else if (x >= b[8] && x < b[9]) m = 8;
  else if (x >= b[2]) m = 2;
  else {for (m=0; ;m++) {if (x >= b[m] && x < b[m+1]) break;}}  //m: Сороковник - 1

  nd = Math.floor(jd-gregorian_to_jd(y,Math.floor(b[m]/100),b[m]%100));   // nd: № дня в Сороковнике - 1; 

  x = a[1]==16 ? m*41 + nd : ssadmes[m] + nd;  // № дня от началы года - 1
  dn = mod(x,9) + a[2]; if (dn > 8) dn -= 9;   // День Недели (Тыжденя)  - 1; 

  nd++;
  d=m*100+nd;

  var ngss = a[4] + '.09.'+ (m>2 ? y-1 : y);  // Дата начала лѣта

// Сварожий Круг (Славянский зодиак)
  if (d >= 818) i = 0;  
  else if (d < 22) i = 1;
  else if (d >= 22  && d < 104) i = 2;
  else if (d >= 104 && d < 125) i = 3;
  else if (d >= 125 && d < 207) i = 4;
  else if (d >= 207 && d < 229) i = 5;
  else if (d >= 229 && d < 312) i = 6;
  else if (d >= 312 && d < 337) i = 7;
  else if (d >= 337 && d < 422) i = 8;
  else if (d >= 422 && d < 504) i = 9;
  else if (d >= 504 && d < 526) i = 10;
  else if (d >= 526 && d < 609) i = 11;
  else if (d >= 609 && d < 631) i = 12;
  else if (d >= 631 && d < 713) i = 13;
  else if (d >= 713 && d < 735) i = 14;
  else if (d >= 735 && d < 818) i = 15;

t = (hour >= 0 && hour < D00 ? hour + 24 : hour) - D00;
t = Math.ceil((t*60+minutes)*1.6);
h = Math.floor(t/144); if (h == 0) h = 16;

return {leto:Ys,    // Лето от С.М.З.Х.
  month:AryanNames.month[m], // Наименование Сороковникв
  nm:m+1,    // Номер Сороковника ( 1 - 9 )
  day:nd,    // День Сороковника
  element:AryanNames.element[a[0]-1],   // Стихия
  color:AryanNames.color[a[0]-1],       // Цвет
  week:AryanNames.week[dn],             // Наименование дня Недели (Тыжденя)
  dn:dn+1,      // День Недели (Тыжденя)  ( 1 - 9 )
  kruglet:AryanNames.kruglet[a[1]-1], //  Круголѣт
  nCL:a[1],    // № Лета в круге Лет
  chertog:AryanNames.chertog[i],  // Чертог
  nch:i+1,  // № Чертога в массиве AryanNames.chertog
  tree:AryanNames.tree[i],      // Дерево
  patron:AryanNames.patron[i],  // Бог покровитель
  LetoCicleLife:LetoCicleLife,  // Лето в круге Жизни
  dayLeto:x+1,     // № дня от началы года
  ngss: ngss,      // Дата начала лѣта
  season: m == 0 || m == 8 || m == 7 ? "Оусень" : (m == 2 || m == 3 || m == 4 ? "Зима" : "Веснв"),
  gr:gr,    // Входные дата и время Григорианского календаря
  partes:t, // Части ( 0 - 143)  
  time: ('0'+h).slice(-2)+':'+('0'+t%144).slice(-3),  // Время Славяно-Арийского календаря
  w:i=mod( Math.floor( (JD  + 1.5)), 7),  // День недели Григорианского календаря
  jd:JD}; // Юлианский день для Григорианского календаря
}

Функия вычисления Юлианского дня из даты Славяно-Арийского календаря

Параметры: y - Лето от С.М.З.Х. m - Сороковник d - День (сутки) h - Часы (1 - 16) p - Чвсти (0 - 142)

function sscal_to_jd(y,m,d,h=4,p=0) {
  var t = (h == 16 ? 0 : h) * 144 + p,
      g = Math.floor(t*0.625);
  var hg = Math.floor(g/60) + D00; 
      if (hg > 24) hg -= 24;
  var mg = g % 60;
  var x = y - 32; 
      if (x <= 0) x += 144;
  var i = x % 144; 
      if (i == 0) i = 144;

      i = sstb1[i][3];
  var a = sstb2[i];
      y -= 5509;
      x = a[m-1]; 
      if (m > 3) y++;
  var jd = gregorian_to_jd(y, Math.floor(x/100), x%100) + d - 1;
      if (hg >= D00) jd--;

  return {
      jd: jd,       // Юлианский день
      hour: hg,     // Часы
      minutes: mg}; // Минуты
  }

Unix, Excel

Система отсчёта времени в UNIX и других POSIX-совместимых операционных системах.

Подробнее...


var J1970 = 2440587.5;                // Юлианский день на 1 января 1970 г. 0 час. (Unix)

Вычисление Unix time из Юлианского Дня

unixTime = Math.round ((jd - J1970) * (60 * 60 * 24 * 1000)) / 1000);

Вычисление Юлианского Дня из Unix time

jd = J1970 + (unixTime / (60 * 60 * 24);

Система отсчёта времени в «Microsoft Excel»

Подробнее...


var J1900 = 2415020.5;                // Эпоха (день 1) системы дат Excel 1900-01-01 (PC)
var J1904 = 2416480.5;                // Эпоха (день 0) системы дат Excel 1904-01-01 (Mac)

Вычисление excel time PC из Юлианского Дня

excelTimePC = (jd - J1900) + 1 +  ((j > 2415078.5) ? 1 : 0);

Вычисление excel time Mac из Юлианского Дня

excelTimeMac = jd - J1904;

Вычисление Юлианского Дня из excel time PC

let d = excelTimePC;
    if (d > 60) d--;
jd = J1900 + (d - 1);

Вычисление Юлианского Дня из excel time Mac

jd = J1904 + (excelTimeMac - 1);

Китайский календарь

Являясь древнейшим на территории Центральной и Восточной Азии, китайский календарь приобрел особое значение не только в Китае, но и других странах буддийской традиции. Воплощая главную идею китайской цивилизации о гармоническом единстве трех сил мироздания: Неба, Земли и Человека, он раскрывает процесс их постоянного взаимодействия.
Китайский календарь - это старейшая во всем мире система хронологической документации, восходящая к дням Желтого Императора, Хуан Ди.
Подробнее...


var objch = {
  Elements: ["Дерево   ▪  木  ▪  mù  ▪  Му",  "Огонь   ▪  火  ▪  huŏ  ▪  Хо",  "Земля   ▪  土  ▪  tŭ  ▪  Ту",  
             "Металл   ▪  金  ▪  jīn  ▪  Цзинь", "Вода   ▪  水  ▪  shuĭ  ▪  Шуй"],

     Color: ["Зелёный/синий ", "Красный", "Жёлтый", "Белый", "Чёрный/голубой"],

 NameYear1: ["甲","jiă","Цзя",  "乙","yĭ","И",     "丙","bĭng","Бин", "丁","dīng","Дин", "戊","wù","У", 
             "己","jĭ","Цзи",   "庚","gēng","Гэн", "辛","xīn","Синь", "壬","rén","Жень", "癸","guĭ","Гуй"],

 NameYear2: ["子","zĭ","Цзы",  "丑","chŏu","Чоу",  "寅","yín","Инь",  "夘","măo","Мао",   "辰","chén","Чэнь",  
             "巳","sì","Сы",   "牛","wŭ","У",      "未","wèi","Вэй",  "申","shēn","Шэнь",  "酉","yŏu","Ю",  
             "戌","xū","Сюй",  "亥","hài","Хай"],

    Animal: ["Крыса/Мышь   ▪  鼠  ▪  shŭ  ▪  Шу", "Бык/Корова   ▪  牛  ▪  niú  ▪  Ню", "Тигр   ▪  虎  ▪  hŭ  ▪  Ху", 
             "Кролик/Заяц/Кот   ▪  兔  ▪  tù ▪  Ту", "Дракон   ▪  龍  ▪  lóng  ▪  Лун", "Змея   ▪  蛇  ▪  shé  ▪  Шэ", 
             "Лошадь   ▪  馬  ▪  mă  ▪  Ма", "Овца/Коза   ▪  羊  ▪  yáng  ▪  Ян", "Обезьяна   ▪  猴  ▪  hóu  ▪  Хоу", 
             "Петух   ▪  鷄  ▪  jī  ▪  Цзи", "Собака   ▪  狗  ▪  gŏu  ▪  Гоу", "Свинья/Кабан   ▪  猪  ▪  zhū  ▪  Чжу"],

    CycTab: [[0,0,0], [0,1,1], [1,2,2], [1,3,3], [2,4,4], [2,5,5], [3,6,6], [3,7,7], [4,8,8], [4,9,9], 
             [0,0,10],[0,1,11],[1,2,0], [1,3,1], [2,4,2], [2,5,3], [3,6,4], [3,7,5], [4,8,6], [4,9,7], 
             [0,0,8], [0,1,9], [1,2,10],[1,3,11],[2,4,0], [2,5,1], [3,6,2], [3,7,3], [4,8,4], [4,9,5], 
             [0,0,6], [0,1,7], [1,2,8], [1,3,9], [2,4,10],[2,5,11],[3,6,0], [3,7,1], [4,8,2], [4,9,3], 
             [0,0,4], [0,1,5], [1,2,6], [1,3,7], [2,4,8], [2,5,9], [3,6,10],[3,7,11],[4,8,0], [4,9,1], 
             [0,0,2], [0,1,3], [1,2,4], [1,3,5], [2,4,6], [2,5,7], [3,6,8], [3,7,9], [4,8,10],[4,9,11]],

 NY2000_2100: [31, 50, 39, 29, 47, 35, 25, 44, 33, 22, 41, 30, 49, 37, 26, 45, 34, 23, 42, 32, 51, 39, 28, 47, 36,   // 1900 - 1924
               24, 44, 33, 23, 41, 30, 48, 37, 26, 45, 35, 24, 42, 31, 50, 39, 27, 46, 36, 25, 44, 33, 22, 41, 29,   // 1925 - 1049
               48, 37, 27, 45, 34, 24, 43, 31, 49, 39, 28, 46, 36, 25, 44, 33, 21, 40, 30, 48, 37, 27, 46, 34, 23,   // 1950 - 1974
               42, 31, 49, 38, 28, 47, 36, 25, 44, 33, 51, 40, 29, 48, 37, 27, 46, 35, 23, 41, 31, 50, 38, 28, 47,   // 1975 - 1999
               36, 24, 43, 32, 22, 40, 29, 49, 38, 26, 45, 34, 23, 41, 31, 50, 39, 28, 47, 36, 25, 43, 32, 22, 41,   // 2000 - 2024
               29, 48, 37, 26, 44, 34, 23, 42, 31, 50, 39, 28, 46, 35, 24, 43, 32, 22, 41, 30, 48, 37, 26, 45, 33,   // 2025 - 2049
               23, 42, 32, 50, 39, 28, 46, 35, 24, 43, 33, 21, 40, 29, 48, 36, 26, 45, 34, 23, 42, 31, 50, 38, 27,   // 2050 - 2074
               46, 36, 24, 43, 33, 22, 40, 29, 48, 37, 26, 45, 34, 24, 41, 30, 49, 38, 27, 46, 36, 25, 43, 32, 21, 40] // 2075 - 2101
 };

определения нового года

Функция возвращает день года year - начало года. Если год попадвет в интервал [1900 - 2100], номер дня берётся из массива objch.NY2000_2100, иначе вычисляется

function NdCY(year)
  { if (year >= 1900 && year <= 2100) return NY2000_2100[year-1900];
    var j = gregorian_to_jd(year-1, 12, 21);
    var j2 = gregorian_to_jd(year, 1, 21);
    j += 59.061177706;
    var v = (j - 2451550.1) / 29.530588853;
    var ag = (v - Math.floor(v));
   if (ag < 0) ag + =1;
   ag *= 29.530588853;
   j -= ag;
   if (j < j2) j += 29.530588853;
   j += .38;
   return Math.floor(j - gregorian_to_jd(year-1, 12, 31));
  }

Китайский циклический календарь

function ChCalendar(year, month, day)
  { var d1,d2,y,i,j,k,s,g,m,nday; 
    nday = yearday(year, month, mday);
    y=year; 
    d1 = NdCY(y);
    if (nday < d1) { y--; d1 = NdCY(y);} 
    d2 = NdCY(y+1) - 1;
    g = (y % 60)-3; 
    if (g <= 0) g + =60;      // Год цикла
    s = objch.CycTab[g - 1];  // данные года
    i = s[0];   // № элемента в массивах Elements (Стихия) и Color (Цвет) - 1
    j = s[1];   // № элемента в массивах NameYear1 («небесные стволы») - 1
    k = s[2];   // № элемента в массиве Animal (Животное) и NameYear2 («земные ветви») - 1

    if  (d1 > 31) {m = 2; d1 -= 31;} 
    else m=1;
    d1 = [y, m, d1];   // Дата начала года
    if (d2 > 31) { m=2; d2 -= 31;} 
    else m=1;
    d2 = [y+1, m, d1];   // Дата конца года
    return {
      yearCH: y + 2698,  // Год по китайскому калндарю
      date: d1,          // Дата начала года [Год, Месяц, День]
      end: d2,           // Дата конца года [Год, Месяц, День]
      ng: g,             // Год цикла
      animal: objch.Animal[k],  // Животное года
      na:k + 1,   // Номер животного (1 - 12)
      ns:j + 1,   // № элемента в массивах NameYear1
      element: objch.Elements[i],  // Стихия года
      color: objch.Color[i],       // Цвет года
      nec:i + 1,  // Номер стихии / цвета (1 - 5)
      name: NameYear1[j*3+2] + '-'+NameYear2[k*3+2]+'   ▪   ' + 
            NameYear1[j*3] + NameYear2[k*3] + '   ▪   ' + 
            NameYear1[j*3+1] + '-' + NameYear2[k*3+1]  // Наименование года
   }
 }