Решил на этой странице разместить алгоритмы конвертирования и вычисления дат. Но, увы, Лень победила мои Желания. Поэтому разместил только тексты на языке 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}; // Минуты }
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);
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] // Наименование года } }