Т.к. переводчик состоит из нескольких частей, то и рассказывать буду по порядку.
1. Как определяется день недели.
Считается кол-во дней от 1/1/1 до введенной даты №1 и №2, а также №0 (т.е. текущей даты). Делается это определением кол-ва дней в каждом году (365 или 366) и их последовательным сложением. Для того, что бы не перебирать постоянно по 2000 лет, сделана функция знающая кол-во дней в каждых 500 лет, а для часто самых часто используемых промежутков (1900-2100) разделение проведено по 100 лет. Таким образом в самом худшем случае перебирается только 499 лет. Затем считается разница в днях между текущей датой и введенной. Эта разница делится на 7 и таким образом узнается кол-во целых недель, которые и отнимаются от результата деления. Полученный остаток показывает на сколько отстоит день недели введенной даты от текущей. Если введенная больше текущей, то эту разницу надо прибавить к порядковому номеру текущего дня недели, если меньше - отнять.
Т.е. если сегодня 12 мая 2000 года, Пятница (5 день недели), то 8 января 2000 года было: 23+29+31+30+12=125(разница в днях), ОКРВНИЗ(124/7)=17(кол-во целых недель), 125-17*7=6(разница в днях недели), 5-6=-1 (т.к. день недели получился отрицательным добавляем одну полную неделю) -1+7=6. Значит 8 января 2000 года, Суббота, а 2 сентября 2000 года будет: 19+30+31+31+2=113(разница в днях), ОКРВНИЗ(110/7)=15, 113-15*7=1, 5+1=6. Значит 2 сентября 2000 года - Суббота.
Конечно есть и более легкие способы определения дня недели (см. статью "Как определить день недели"). Однако разница в днях между введенными датами все равно понадобится в дальнейшем и хотя вводимый год ограничен 9999, такой способ позволяет высчитывать день недели любого года.
2. Как считается разница между двумя датами.
Разница в днях (полученная ранее) переводится в секунды умножением на (60*60*24) 86400, к ней прибавляются введенные часы, минуты (также переведенные в секунды) и сами секунды. Разница между двумя датами в секундах дает ее саму. Делим ее на 60, получаем кол-во минут между датами. Делим на 3600 получаем кол-во часов, на 86400 - кол-во дней.
С месяцами и годами немного сложнее, т.к. в отдельно взятом году 365,2425 дней (а не 365), каждые 4 года накапливается 1 дополнительный день, для чего собственно и вводятся високосные годы. Таким образом кол-во секунд в году равно 365,2425*24*60*60=31556952. Такой вариант расчета дает некоторую погрешность для одного года, однако она исчезает каждые 4 года и столь незначительна, что проявляется лишь в 3 знаке после запятой. После определения количества лет умножаем это число на 12 и получаем кол-во месяцев. Вот так все "просто".
3. Как считается дата по "старому" стилю.
Современный календарь называется григорианским (новый стиль), он был введен папой Григорием XIII с 4 октября 1582 года (четверг), после которого наступило 15 октября 1582 года (пятница) и заменил юлианский календарь (старый стиль), который применялся с 45 до н. э.
В юлианском календаре средняя длительность года в интервале 4 лет равнялась 365,25 суток, что на 11 мин 14 сек длиннее тропического года. Длина года в григорианском календаре в среднем равна 365,2425 суток, что лишь на 26 сек превышает тропический год.
Григорианский календарь более точен, поэтому в нем меньше високосных годов, вводимых для устранения расхождения календаря со счетом тропических лет. Таким образом, до 4 октября 1582 года не существовало вообще понятия "старый" или "новый" стиль.
Различие между старым и новым стилями составляет в XVIII в. 11 суток, в XIX в. 12 суток и в XX в. 13 суток.
В России григорианский календарь введен с 31 января 1918 года, после которого наступило 14 февраля 1918 г. После этой все даты считаются по "новому" стилю.
4. Как определяется знак года по восточному календарю.
Для определения знака года я вывел собственную формулу. Каждый знак года по восточному календарю имеет свой коэффициент:
0 - год Обезьяны,
1 - год Петуха,
2 - год Собаки,
3 - год Кабана,
4 - год Крысы,
5 - год Быка,
6 - год Тигра,
7 - год Кролика,
8 - год Дракона,
9 - год Змеи,
10 - год Лошади,
11 - год Овцы;
Если разделить номер года на 12, а затем отнять целую часть от деления, умножить полученную разность на 12 и округлить ее вверх, то для каждого 12 года получается один и тот же коэффициент.
Например: год 1978 - ОКРВВЕРХ((1978/12-ОКРВНИЗ(1978/12))*12)= ОКРВВЕРХ((164,833333-164)*12)= ОКРВВЕРХ(0,833333*12)= ОКРВВЕРХ(9,999996)=10, значит 1978 - год Лошади.
5. Как определяется ближайшая юбилейная секунда, минута и т.д.
Зная разницу в секундах между датой №2 и текущей получаем разницу в днях, минутах и часах.
Для каждого расчета задаем шаг:
1 000 - для дней,
100 000 - для часов,
1 000 000 - для минут,
100 000 000 - для секунд.
Затем получаем разницу между количеством дней и шагом увеличивая его каждый раз на "шаг", до тех пор пока разница станет больше 0. Затем получаем разницу между этим кол-вом и ближайшим больши числом кратным шагу. Это будет число дней, часов, минут или секунд (в зависимости от того что считаем) до события. Затем отделяем целое кол-во дней, часов, минут, секунд и добавляем их к текущей дате, получая дату события. Как видите все теоретически просто, однако программирование всего это не так уж и легко.
Например: в дате №2 введен ваш день рождения и 1000й день у вас 31 Августа 2003г. с Кд=9, это значит, что 31 Августа будет ваш 9000й день жизни.