-Подписка по e-mail

 

 -Поиск по дневнику

Поиск сообщений в teal

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 19.04.2006
Записей:
Комментариев:
Написано: 2583


Календари

Вторник, 29 Января 2008 г. 11:19 + в цитатник
Вчера понадобилось вычислять день недели по дате. Т.е. банальный календарь сделать. Заодно разобрался когда и как были введены Юлианский и Григорианский календари. Забавная история, особенно если учесть, что мы до сих пор живем не по правильному календарю =) Точнее, понадобилось вводить еще и високосную секунду в довесок. Еще фишка с замедлением вращения земли: високосные секунды появляются все чаще и чаще. В общем, жуть.
Ниже кусок кода, вычисляющий день недели по дате (работает с учетом перехода с одного календаря на другой в 1582 году =))) Есть реализации и по-проще, но эта штука будет нормально работать и с годами до нашей эры.

const int DaysSoFar[][13] =
{
        { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
        { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
};

size_t week_day(int year, int month, int day)
{
        if (year < 0) ++year;
        int lp = !(year & 3);
        long j = ((year - 1) / 4) + DaysSoFar[lp][month - 1]
                + day + year * 365L + 1721423L - 366;
        if (j >= 2299169L) j += 2 - year / 100 * 3 / 4;
        return (size_t)((j + 1) % 7 + 1);
}

UPD: Сейчас в другой уже проге где-то ошибся с вычислением предыдущих хвостов месяца, для примера выбираю Июнь 2008 года и вижу дату 32-е мая. Прямо как в "Тот самый Мюнхаузен". Даже на стуле подпрыгнул.
Метки:  

 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку