§ Вычисление
Мне очень, очень давно хотелось сделать асболютно универсальный и независимый от компьютера календарь. Сделать его таким, чтобы рассчитать день недели по заданному дню было легко и просто на калькуляторе. И мне это сделать удалось. Календарь работает, начиная с 1901 года и заканчивая 2100.
§ Алгоритм расчета
-
A = [ 365.25 * (ГОД - 1) ]
— получаем целое число A - Если при умножении на 365.25 у нас осталась дробная часть "0.75" - это значит, что год не високосный, иначе - високосный.
Получаем значение B из следующей таблицы
| Янв | Фев | Мар | Апр | Май | Июн | Июл | Авг | Сен | Окт | Ноя | Дек |
Не високосный | 0 | 31 | 59 | 90 | 120 | 151 | 181 | 212 | 243 | 273 | 304 | 334 |
Високосный | 0 | 31 | 59 | 91 | 121 | 152 | 182 | 213 | 244 | 274 | 305 | 335 |
Дней в месяце | 31 | 28/29 | 31 | 30 | 31 | 30 | 31 | 31 | 30 | 31 | 30 | 31 |
День недели = (A + B + День + 5) / 7.
При делении необходимо узнать первую цифру после запятой, и по таблице определить день недели:
Цифра | День недели |
0 | Понедельник |
1 | Вторник |
2 | Среда |
4 | Четверг |
5 | Пятница |
7 | Суббота |
8 | Воскресенье |
§ Пример расчета
Возьмем 2063 год, 12 мая. Итак
- 365.25 * (2063 - 1) = 753145,5
- A = 753145, год - не високосный (т.к. 0,5 есть)
- B = 120 из таблицы для не високосного года
- День = (753145год + 120месяц + 12день + 5коррекция) / 7 = 753282 / 7 = 107611,714286
- Первая цифра после запятой - "7", значит, судя по таблице, это Суббота.
§ Основные проблемы
- Нельзя забывать вычитать -1 из года
- Не забывать прибавлять +5 в конечном расчете
- Цифра после запятой в конце - не номер дня недели, соответствие смотреть в таблице