Вторник, 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-е мая. Прямо как в "Тот самый Мюнхаузен". Даже на стуле подпрыгнул.
Метки:
календарь
-
Запись понравилась
-
0
Процитировали
-
0
Сохранили
-