9 мая 1945 года была среда. Проверить это, как и день недели любой другой даты, можно тремя способами: на Python, функцией ДЕНЬНЕД в Excel или в уме, если запомнить двенадцать кодов месяцев.
Ниже все три способа с примерами, формула Зеллера для тех, кому нужна математика, и одна ловушка, на которой ошибаются чаще всего: даты по старому стилю. Если Python у вас ещё не стоит, начните с первой программы на Python, там пять минут на установку и запуск.
Какой день недели был 9 мая 1945 года

Среда. Вот как выглядел май 1945 года в календаре, который печатает Python:
мая 1945
пн вт ср чт пт сб вс
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Дни недели других памятных дат:
| Дата | День недели |
|---|---|
| 22 июня 1941 года | воскресенье |
| 9 мая 1945 года | среда |
| 12 апреля 1961 года | среда |
| 26 декабря 1991 года | четверг |
| 1 января 2000 года | суббота |
Все даты в таблице посчитаны по григорианскому календарю, по которому Россия живёт с 1918 года. Для более ранних дат есть оговорка, о ней отдельный раздел ниже.
Как узнать день недели по дате на Python
В стандартной библиотеке Python для этого есть модуль datetime, ничего устанавливать не нужно. Порядок такой:
- Создайте файл с расширением
.pyи откройте его в редакторе. Как это сделать в VS Code, показано в инструкции по запуску файла Python. - Импортируйте класс
dateи создайте дату: год, месяц, число. - Вызовите метод
weekday()илиisoweekday().
from datetime import date
d = date(1945, 5, 9)
print(d.weekday()) # 0 — понедельник, 6 — воскресенье
print(d.isoweekday()) # 1 — понедельник, 7 — воскресенье
2
3
Нумерация описана в документации Python: у weekday() понедельник равен 0, у isoweekday() он равен 1. Эти два метода путают чаще всего, об этой ошибке ещё скажем в конце.
Как вывести название дня, а не номер
Проще всего завести список из семи названий и взять из него элемент по номеру:
from datetime import date
DAYS = ["понедельник", "вторник", "среда", "четверг",
"пятница", "суббота", "воскресенье"]
d = date(1945, 5, 9)
print(DAYS[d.weekday()])
среда
Если нужна строка вроде «9 мая 1945 года, среда», соберите её через f-строку: f"{d.day} мая {d.year} года, {DAYS[d.weekday()]}".
Как напечатать календарь на месяц
Календарь из первого раздела печатает модуль calendar. Чтобы дни недели были по-русски, нужен класс LocaleTextCalendar с русской локалью:
import calendar
cal = calendar.LocaleTextCalendar(locale="ru_RU.UTF-8")
cal.prmonth(1945, 5)
Если такой локали в системе нет, Python остановится с ошибкой locale.Error: unsupported locale setting. Тогда берите обычный calendar.prmonth(1945, 5): календарь будет тот же, только с английскими сокращениями Mo, Tu, We.
Какой день был 5 дней или 2 недели назад
Для сдвига на N дней есть timedelta. Возьмём для примера 29 октября 2026 года:
from datetime import date, timedelta
today = date(2026, 10, 29)
DAYS = ["понедельник", "вторник", "среда", "четверг",
"пятница", "суббота", "воскресенье"]
for shift in (5, 14):
d = today - timedelta(days=shift)
print(shift, d.strftime("%d.%m.%Y"), DAYS[d.weekday()])
5 24.10.2026 суббота
14 15.10.2026 четверг
Чтобы считать от сегодняшнего дня, замените первую строку на today = date.today(). Две недели назад всегда тот же день недели, что и сегодня: 14 делится на 7 без остатка.
Как определить день недели в уме

Без компьютера день недели считают по кодам. Складываете число, код месяца, код века, две последние цифры года и четверть от них, а потом берёте остаток от деления на 7.
Коды месяцев придётся выучить, их двенадцать:
| Янв | Фев | Мар | Апр | Май | Июн | Июл | Авг | Сен | Окт | Ноя | Дек |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 3 | 3 | 6 | 1 | 4 | 6 | 2 | 5 | 0 | 3 | 5 |
Коды веков: у 1700-х годов 4, у 1800-х 2, у 1900-х 0, у 2000-х 6, у 2100-х 4.
Алгоритм:
- Возьмите две последние цифры года и прибавьте к ним их четверть без остатка. Для 1945 года это 45 + 11 = 56.
- Прибавьте число месяца, код месяца и код века.
- Если год високосный, а дата в январе или феврале, вычтите 1.
- Найдите остаток от деления на 7. Остаток 1 означает понедельник, 2 вторник и так далее до 6, субботы. Остаток 0 означает воскресенье.
Проверим на 9 мая 1945 года: 9 + 1 (май) + 0 (1900-е) + 45 + 11 = 66. Остаток от деления 66 на 7 равен 3, это среда.
Ещё два примера. 22 июня 1941 года: 22 + 4 + 0 + 41 + 10 = 77, остаток 0, воскресенье. 1 января 2024 года: 1 + 0 + 6 + 24 + 6 − 1 (високосный январь) = 36, остаток 1, понедельник.
Способ работает для любой даты с 1700 по 2199 год, если брать коды веков из списка выше. «Четверть без остатка» означает целочисленное деление: 45 / 4 даёт 11, дробную часть отбрасываем.
Формула Зеллера
Если считать нужно в программе, а готового модуля под рукой нет, пригодится формула Зеллера. Она даёт номер дня одной строкой арифметики, а записать её удобно в виде функции:
def zeller(day, month, year):
if month < 3: # январь и февраль — 13-й и 14-й месяцы прошлого года
month += 12
year -= 1
k = year % 100 # год внутри века
j = year // 100 # номер века
h = (day + 13 * (month + 1) // 5 + k + k // 4 + j // 4 + 5 * j) % 7
return ["суббота", "воскресенье", "понедельник", "вторник",
"среда", "четверг", "пятница"][h]
print(zeller(9, 5, 1945))
print(zeller(22, 6, 1941))
print(zeller(12, 4, 1961))
среда
воскресенье
среда
У формулы две особенности. Отсчёт идёт от субботы: результат 0 означает субботу, а не воскресенье или понедельник. А январь и февраль считаются последними месяцами предыдущего года, иначе високосный день сбивает результат.
Вывод формулы и её вариант для юлианского календаря приведены в англоязычной статье Википедии о сравнении Зеллера, там же сказано, что 0 означает субботу. Код выше даёт верный ответ для любой даты по григорианскому календарю.
День недели по дате в Excel
В Excel день недели возвращает функция ДЕНЬНЕД. Синтаксис по справке Microsoft: ДЕНЬНЕД(дата_в_числовом_формате;[тип]). Без второго аргумента функция считает неделю с воскресенья, и для среды вернёт 4, а не 3.
| Тип | Что возвращает |
|---|---|
| 1 или опущен | от 1 (воскресенье) до 7 (суббота) |
| 2 | от 1 (понедельник) до 7 (воскресенье) |
| 3 | от 0 (понедельник) до 6 (воскресенье) |
Для привычной русской нумерации пишите =ДЕНЬНЕД(A2;2). Название дня даёт функция ТЕКСТ: =ТЕКСТ(A2;"ДДДД") выведет полное название, этот формат приведён в справке по функции ТЕКСТ.
Функция с тем же именем есть в Яндекс Таблицах, её описание лежит в справке Яндекс 360. Если нужно посчитать не день недели, а число дней между датами, это другая задача, она разобрана в статье про разницу дат в Excel.
Почему Excel ошибается на датах до 1900 года
Excel хранит дату как номер дня, отсчитанный от 1 января 1900 года. Так устроена система дат 1900, которая по справке Microsoft стоит по умолчанию в Excel для Windows. Дату 9 мая 1945 года Excel поймёт, а дату раньше 1 января 1900 года в эту систему уже не уложить.
Вторая проблема тоньше. Excel считает 1900 год високосным, хотя он таким не был, и Microsoft прямо пишет, что из-за этого ДЕНЬНЕД возвращает неверные значения для дат до 1 марта 1900 года. Для старых дат берите Python или считайте в уме. Если Python для вас новый, начните со списка основных команд.
Даты до 1918 года: старый и новый стиль
Python считает по григорианскому календарю даже для дат, когда его ещё не было. В документации Python такой календарь называется «пролептическим григорианским»: нынешние правила продлены в прошлое без конца.
В России григорианский календарь ввели декретом 1918 года: сразу после 31 января наступило 14 февраля, об этом есть заметка Президентской библиотеки. Поэтому даты в документах до 1918 года обычно записаны по старому, юлианскому стилю.
Ошибка выглядит так: берёте дату Бородинского сражения, 26 августа 1812 года по старому стилю, и подставляете её в калькулятор как есть.
from datetime import date, timedelta
DAYS = ["понедельник", "вторник", "среда", "четверг",
"пятница", "суббота", "воскресенье"]
old = date(1812, 8, 26) # дата по старому стилю
new = old + timedelta(days=12) # в XIX веке разница 12 дней
print(new, DAYS[new.weekday()])
print(old, DAYS[old.weekday()]) # ошибка: старый стиль как новый
1812-09-07 понедельник
1812-08-26 среда
Правильный ответ: понедельник. Сначала дату переводят в новый стиль, потом считают. Разница между стилями в XVIII веке 11 дней, в XIX 12, а с марта 1900 года 13.
Отсюда и ответ на вопрос, какой день недели был 1 января 1 года. По правилам Python это понедельник: date(1, 1, 1).weekday() возвращает 0. Но в I веке жили по юлианскому календарю, и по нему тот же день был субботой.
Через сколько лет повторяется календарь
Календарь целого года совпадает, когда у двух лет один и тот же день недели 1 января и оба они високосные или оба обычные. Найдём, какие годы повторяют календарь 1945-го:
import calendar
base = calendar.monthcalendar(1945, 1)
same = [y for y in range(1946, 2030)
if calendar.isleap(y) == calendar.isleap(1945)
and calendar.monthcalendar(y, 1) == base]
print(same)
[1951, 1962, 1973, 1979, 1990, 2001, 2007, 2018, 2029]
Промежутки идут в порядке 6, 11, 11 лет, и через 28 лет всё повторяется: 1945, 1973, 2001, 2029. Цикл в 28 лет работает внутри одного века. На границе, где год вроде 1900 или 2100 не високосный, ряд сбивается.
Для отдельной даты повторов больше. 9 мая приходилось на среду ещё в 1956, 1984 и 2012 годах: в високосный год с 1 марта календарь совпадает с обычным, начавшимся на день позже.
Частые ошибки

- Результат сдвинут на один день. Перепутаны
weekday()иisoweekday()в Python или забыт второй аргумент ДЕНЬНЕД в Excel. Решение: проверьте, с какого дня начинается отсчёт, и сверьте результат с сегодняшней датой. - Старая дата посчитана без перевода в новый стиль. Для документов до февраля 1918 года сначала прибавьте 11, 12 или 13 дней в зависимости от века.
- Excel выдаёт ошибку или чушь на XIX веке. Он не знает дат раньше 1900 года. Решение: Python или способ кодов.
- Названия дней по-английски. Метод
strftime("%A")иcalendar.prmonth()берут язык из локали системы. Список из семи русских названий надёжнее. - В формуле Зеллера воскресенье оказалось субботой. Её отсчёт начинается с субботы, а январь и февраль относятся к прошлому году.
Где освоить Python системно
Задача про день недели закрывается тремя строками, но в ней уже есть почти всё, с чего начинают Python: модули, списки, функции и арифметика с остатком. Если хочется потренироваться дальше, загляните в 30 задач по Python для начинающих, а план перехода в профессию есть в материале как стать Python-разработчиком.
Если учиться удобнее с наставником и проверкой домашних заданий, мы сравнили онлайн-курсы по Python:
| Курс | Школа | Стоимость со скидкой | В рассрочку | Длительность | Обзор курса от Checkroi |
|---|---|---|---|---|---|
| Профессия «Python-разработчик» Перейти на сайт курса | 157 335 ₽ | 5987 ₽/мес. | 10 месяцев | Обзор курса | |
| Fullstack-разработчик на Python Перейти на сайт курса | 137 000 ₽ | 7125 ₽/мес. | 21 месяц | Обзор курса | |
| ДО Профессия Python-разработчик Перейти на сайт курса | 149 001 ₽ | 3167 ₽/мес. | 10 месяцев | Обзор курса | |
| Автоматизированное тестирование на Python Перейти на сайт курса | 122 226 ₽ | 4108 ₽/мес. | 9 месяцев | Обзор курса | |
| Профессия Python-разработчик Перейти на сайт курса | 140 040 ₽ | 4279 ₽/мес. | 10 месяцев | Обзор курса |
Больше программ — в полном каталоге курсов по Python




