| « Эмуляция операции деления на константу для ARM | Фотографии SH28D1 » |
Нашей операционной системе понадобился календарь. До сего момента у нас был штамп времени -- число секуд с момента включения, а тут вдруг понадобилось хронологический порядок человеку демонстрировать в понятных для человека условных единицах...
Продолжение:
Царь Юрий (Юлий Цезарь) утвердил календарь Юлианский. В Юлианский календаре в году 365 дней и 1/4 одна четверть, каждые 4 года начисляется ещё один день.
Исчисление ведется от начала времен, которые, было установлено, начинаются в 4800 г. до н.э.
Поп Григорий (Папа Грегори XIII, Pope Gregory XIII) 4 окт.1582 ввел Григорианский календарь, который уточнял Юлианский.
С тех пор, каждые 100 лет лишний день не начисляется, а каждые 400 всё-таки начисляется.
Продолжительность года составила 365 и 97/400, вернее 365 + 1/4 - 1/100 +1/400
Барон Мюнхгаузен пробобовал ввести свою поправку, но был бит за это.
Ошибка в Григорианском календаре накапливается за 3200 лет.
Синхронизация календарей требуется раз в 100 лет. от 1.3.2000 до 28.2.2100 можно использовать люлянские формулы, упрощенные, потом убавить день и ещё на сто лет хватит.
Первичным является количество дней, от календаря не зависит.
Количество дней можно перевести в календарную дату число-месяц-год
Из количества дней можно вычислить день недели. День недели не зависит от календаря.
Начало времен в каждой операционке свое. В нашей системе начало времен вымеряется по утренней звезде от 1.1.1970.
Для перевода даты люниксовой в дату Юлианскую надо использовать магическое число Люлян - разницу начала исчислений.
В будущих версиях, возможно, понадобится держать время летнее и зимнее - декретное.
Правила перевода часов: часы переводятся в 3 часа ночи в последнее воскресенье марта вперед и обратно на час назад в последнее воскресенье октября.
А вот загадочный пример люлянской магии из нашей программы
uint32_t y = year + 4800 - !!(month<3);
static const uint8_t m[] = {23,26,29,0,3,5,8,10,13,16,18,21,23};
return (day + y + (y>>2) +m[month]) % 7;
-- так вычисляется день недели.
URL трекбека (щелкните правой кнопкой мыши и скопируйте ссылку)