Календари
29-01-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-е мая. Прямо как в "Тот самый Мюнхаузен". Даже на стуле подпрыгнул.
вверх^
к полной версии
понравилось!
в evernote