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


Прежде всего, несколько слов о юлианском календаре для нужд астрономии и истории.

К 1 января 1900г. прошло по юлианскому календарю 2415020 дней, т.е. он — 2415021–й. Дальше все понятно без слов, только короткие ремарки:

// месяца года
char *month[12] = { "Junuary", "February", "March", "April",
		"May", "June", "July", "August", "September",
		"October", "November", "December" };
// число дней в месецах в не високосный год
int nday[12] = { 31, 28, 31, 30, 31, 30,
		31, 31, 30, 31, 30, 31 };
// число дней прошедших с 1 января до 1 числа текущего месяца
int nd[12] = { 0, 31, 59, 90, 120, 151,
		181, 212, 243, 273, 304, 334 };
// задиакальные созвездия
char *zmonth[12] = { "Capricorn", "Aquarius", "Pisces", "Aries",
		"Taurus", "Gemini", "Cancer", "Leo",
		"Virgo", "Libra", "Scorpio", "Sagittarius" };
// число дней прошедших с начала года до вступления солнца в созвездие
int nz[12] = { 356, 21, 50, 80, 111, 142,
		173, 204, 236, 267, 297, 327 };
// дни недели
char *weeks[7] = { "Monday", "Tuesday", "Wednesday", "Thursday",
		"Friday", "Saturday", "Sunday" };
// вычисление "юлианского дня"
long day(int y,int m,int d)
{	long dd=1721060L+d+nd[m-1]+365*y+y/4-y/100+y/400;
	if((y%4==0)&&(y%100!=0)||(y%400==0)&&(m<3))dd--;
	return dd;
}
// вариант программы предложенный В.Кларк и П.Стумпф
// из Национальной Радиоастрономической Обсерватории США
double dday(int y,int m,int d)
{	long dd=1721028+d+(m*3057)/100+((5-m/3)/5)*(2-(4-y%4)/4+
	(100-y%100)/100-(400-y%400)/400)+y*365+y/4-y/100+y/400;
	return (double)dd; /* целое число отвечает - 00h 00m */
}
// вычисление дня недели: Понедельник-Воскресенье (0-6)
int week(int y,int m,int d)
{	long dd=day(y,m,d)-day(1583,1,1)-5;
	/* 01.01.1583 была суббота */
	return dd%7;
}
// вариант программы опубликованный М.Ленуар в журнале IBM
int week_(int y,int m,int d)
{	int y1,y2;long c;
	y1=y/100;y2=y%100;c=(long)(365.25*y2)+(long)(30.57*m)+d+2;
	if(m<=2){if(y2==0)y2=y1;if(y2%4==0)c+=1;else c+=2;}
	return c%7;
}

На Руси было свое летосчисление, посмотрим как быть с ним.

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

С 1492 года по 1699 год новый год начинался 1 сентября, а до 1492 года — в начале марта (примерно 1 марта). Поэтому для перевода года в древнерусской системе обозначений надо вычесть 5508, если момент попадает на его основную часть (с 1492 по 1699 год — с января по август, а до 1492 года — с марта по декабрь). Если в календарной дате для периода 1492-1699 годов указан месяц от сентября по декабрь, то для перевода на нынешний вид учета времени надо вычесть из древнерусского числа года уже не 5508, а 5509, но если год от Рождества Христова получается раньше 1492 года, то для января и февраля надо вычесть не 5508, а 5507.


Несколько слов о мусульманском (лунном) календаре хиджра. Приближенно даты можно перевести на григорианский либо юлианский стиль по следующей формуле, в которой E означает год по европейскому календарю (григорианскому или юлианскому), а X — год хиджры:

Е = Х + 622 — X/33
Х = Е — 622 + (E — 622)/32

Далее