« Эмуляция операции деления на константу для ARMФотографии SH28D1 »

R3-RTOS люлянский календарь

2010-01-01

Постоянная ссылка 01:11:20, от george Email , 259 слов   Russian (RU)
Рубрики: Welcome, Хроники лаборатории, Статьи, R3FS

R3-RTOS люлянский календарь

Нашей операционной системе понадобился календарь. До сего момента у нас был штамп времени -- число секуд с момента включения, а тут вдруг понадобилось хронологический порядок человеку демонстрировать в понятных для человека условных единицах...

Продолжение:

Царь Юрий (Юлий Цезарь) утвердил календарь Юлианский. В Юлианский календаре в году 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 трекбека (щелкните правой кнопкой мыши и скопируйте ссылку)

Еще нет отзывов

Оставить комментарий


Ваш email адрес не будет показан на сайте.

Ваш URL будет показан.
ПлохоПревосходно
(Заменить прерывания строк на <br />)
(Имя, email и сайт)
(Разрешить пользователям посылать вам сообщения (ваш email не отображается).)

Вы можете использовать OpenID чтобы предоставить ваше имя, email и url.

Компания "НПФ Геолаб" является разработчиком систем сбора данных и контроллеров станков с ЧПУ. Чтобы общественность была в курсе наших последних разработок, мы решили вести блог.

Поиск