Какой сегодня день недели: как узнать день недели любой даты

Вопрос «какой сегодня день недели» кажется таким же простым, как взгляд на календарь. Пока речь о сегодняшнем дне, всё действительно решается одним взглядом. Сложности начинаются в других случаях: нужно назвать день недели для даты из будущего, посчитать, на какой день попадёт дедлайн или выписка, сравнить две версии расписания, вспомнить, каким был конкретный вторник три года назад. Обычный календарь в таких случаях не помощник: он показывает только то, что уже наступило или наступает в этом году.
Почему счёт дня недели устроен не так, как кажется
Дней в неделе всегда семь, и это сильно упрощает задачу: достаточно знать одну опорную дату, а дальше всё сводится к сложению и остатку от деления на 7. Остаток 0 означает тот же день недели, 1 означает следующий, и так далее по кругу. Проблема в том, что опорную дату нужно где-то взять, а сдвиги между месяцами неодинаковы: в январе 31 день, в апреле 30, в феврале 28, и каждый месяц двигает счёт на своё число дней.
Добавьте сюда 29 февраля, которое появляется раз в четыре года и добавляет к календарю лишний день. После него любой дальнейший счёт по правилу «длина предыдущего месяца плюс один» даст неверный результат, причём ошибка будет выглядеть правдоподобно: день недели сдвинется ровно на единицу, и человек решит, что ошибся в чём-то другом.
Быстрый ответ без всякой теории
Для большинства задач считать вручную не нужно вообще. Откройте калькулятор дня недели, впишите дату в поле (кнопка «Сегодня» подставляет текущую) и сразу получите ответ. Одновременно он показывает три вещи, которые обычно ищут вместе с днём недели: порядковый номер дня в году вместе с общим числом дней, номер недели по ISO 8601 и признак високосного года. Отдельными карточками ниже лежат четыре исторические даты, по которым удобно проверять счёт: 12 апреля 1961 года, 20 июля 1969 года, 9 мая 1945 года и 1 января 2000 года. По клику они подставляются в поле даты.
- день недели на вашем языке, будь то «вторник» или «Tuesday»;
- номер дня в году и общее число дней в этом году (365 или 366);
- номер недели по ISO 8601, где недели идут с понедельника;
- дату в человекочитаемом виде, её можно скопировать одной кнопкой.
Если задача шире, чем «назвать день», подключайте соседние инструменты: калькулятор разницы дат посчитает интервал между двумя датами, форматтер дат покажет ту же дату сразу во всех популярных форматах, включая Unix-время, а конвертер Unix-времени пригодится, когда день недели известен, а время нет. Что такое timestamp и почему он всегда привязан к UTC, разобрано в статье про форматы дат.
Правило Зейлера: формула, которая работает всегда
Христианские календари веками вычисляли день недели арифметически, без календаря в кармане. Классический способ придумал австрийский математик и астроном Иоганн Зейлер в 1582 году, в год введения григорианского календаря. С тех пор формула почти не менялась: она работает с любой датой и не требует промежуточных вычислений.
h = (q + ⌊13(m+1)/5⌋ + K + ⌊K/4⌋ + ⌊J/4⌋ + 5J) mod 7
q - число месяца (1…31)
m - месяц по счёту с марта: март = 3 … декабрь = 12,
январь = 13 и февраль = 14 (тогда год уменьшают на 1)
K - последние две цифры года (0…99)
J - первые две цифры года, то есть век (0…19)
Остаток h означает день недели:
0 - суббота, 1 - воскресенье, 2 - понедельник, 3 - вторник,
4 - среда, 5 - четверг, 6 - пятницаСмысл приёма в том, что месяцы перенумеровываются так, чтобы март оказался третьим. Тогда длины месяцев идут подряд как 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, и множитель 13/5 в формуле работает как «месяц плюс один, делённый на пять», что и даёт нужное смещение для каждого месяца. Январь и февраль приравниваются к 13 и 14 предыдущего года, потому что при таком счёте они оказываются в конце года, а не в начале, и вся арифметика остаётся в одном ритме.
Разбор на конкретной дате
Возьмём 3 ноября 2026 года. Здесь m = 11, поэтому год менять не нужно: K = 26, J = 20, q = 3. Дальше всё сводится к сложению и одному делению.
q = 3, m = 11, K = 26, J = 20
⌊13(m+1)/5⌋ = ⌊13 × 12 / 5⌋ = ⌊156 / 5⌋ = 31
⌊K/4⌋ = ⌊26 / 4⌋ = 6
⌊J/4⌋ = ⌊20 / 4⌋ = 5
5J = 5 × 20 = 100
h = (3 + 31 + 26 + 6 + 5 + 100) mod 7
h = 171 mod 7
h = 3 → вторникОстаток 3 в принятой нумерации означает вторник. Это сходится с тем, что показывает любой календарь: 3 ноября 2026 года действительно вторник, по ISO 8601 это 45-я неделя, вторник, 307-й день года из 365.
Проверка на 1 января 2000 года
Формулу стоит проверить на дате, результат которой известен наверняка. 1 января 2000 года было субботой, и это легко запомнить: именно с этого дня в обращении оказался 2000-й год, тот самый, который все считали високосным. Подставляем январь как 13-й месяц и уменьшаем год на единицу: m = 13, K = 99, J = 19, q = 1.
q = 1, m = 13, K = 99, J = 19
⌊13(m+1)/5⌋ = ⌊13 × 14 / 5⌋ = ⌊182 / 5⌋ = 36
⌊K/4⌋ = ⌊99 / 4⌋ = 24
⌊J/4⌋ = ⌊19 / 4⌋ = 4
5J = 5 × 19 = 95
h = (1 + 36 + 99 + 24 + 4 + 95) mod 7
h = 259 mod 7
h = 0 → субботаОстаток ноль означает субботу, всё сошлось. Проверить можно и на 1 января 2020 года: там q = 1, m = 13, K = 19, J = 20, сумма даёт 165, остаток 4, то есть среда, и это действительно была среда. Одна формула покрывает любой год григорианского календаря, а менять в ней надо всего четыре числа.
Считаем от известной даты: таблица сдвигов
Если формула кажется слишком тяжёлой, есть способ за пару минут, который работает на бумаге. Смысл такой: сдвиг с одной даты на другую определяется числом дней между ними, а число дней между датами одного и того же числа месяца равно длине промежуточных месяцев. Остаётся превратить эти длины в сдвиг по дням недели.
- 31 день в месяце даёт сдвиг +3, потому что 31 это 4 недели и 3 дня;
- 30 дней дают сдвиг +2;
- 28 дней, то есть февраль обычного года, дают сдвиг 0, иначе говоря тот же день недели;
- 29 дней, то есть февраль високосного года, дают сдвиг +1.
Проверим на живом примере. Пусть известно, что 1 января 2026 года был четвергом. До 1 ноября набралось 304 дня (январь 31, февраль 28, март 31, апрель 30, май 31, июнь 30, июль 31, август 31, сентябрь 30, октябрь 31), а до 15 ноября ещё 14 дней, итого 318. Дальше 318 mod 7 = 3, то есть четверг плюс три дня, то есть воскресенье. По календарю 15 ноября 2026 года действительно воскресенье.
январь 1 января 2026 - четверг
февраль 1 февраля 2026 - воскресенье
март 1 марта 2026 - воскресенье
апрель 1 апреля 2026 - среда
май 1 мая 2026 - пятница
июнь 1 июня 2026 - понедельник
июль 1 июля 2026 - среда
август 1 августа 2026 - суббота
сентябрь 1 сентября 2026 - вторник
октябрь 1 октября 2026 - четверг
ноябрь 1 ноября 2026 - воскресенье
декабрь 1 декабря 2026 - вторникТакую же табличку удобно держать для 1 января каждого года: 2026-й начинается в четверг, 2027-й в пятницу, 2028-й в субботу, 2029-й в понедельник, 2030-й во вторник, 2031-й в среду, 2032-й в четверг. Здесь работает простое правило: обычный год сдвигает 1 января на следующий день недели, а високосный на два, потому что в нём 366 дней, это 52 недели и 2 дня.
29 февраля и почему после него счёт сбивается
В високосный год календарь длиннее на один день, и этот день стоит ровно посередине. В 2024 году 29 февраля был четвергом. В 2026 году 28 февраля, на ту же самую дату, уже суббота: два года разницы дали сдвиг на два дня, потому что между ними успел попасть високосный 2024-й. Значит, прибавляя «длину месяца» от февраля к марту, в високосном году нужно брать 29, а не 28.
28 февраля 2026 - суббота 29 февраля 2024 - четверг
1 марта 2026 - воскресенье 1 марта 2024 - пятницаИменно поэтому «посчитать от Нового года» в високосном и обычном году даёт разные ответы, если держаться таблицы «31 день на месяц». Сравните 15 января и 15 марта: в 2026 году между ними 59 дней, это 16 дней остатка января, 28 дней февраля и 15 дней марта, а в 2024-м уже 60, потому что февраль длиннее на один день. День недели в обоих случаях тоже разный: в 2026-м 15 марта это воскресенье, в 2024-м пятница.
Excel, Python и JavaScript
В Excel всё считается одной формулой. Функция WEEKDAY с двумя аргументами возвращает номер от 1 до 7, где 1 это понедельник: =WEEKDAY(A1;2). В русской версии Excel разделителем аргументов служит точка с запятой, в английской запятая. Функция TEXT с шаблоном «dddd» вернёт название дня недели, но на русской локали это будет «вторник», а на английской «Tuesday», поэтому в формулах, которые уезжают за границу, надёжнее опираться на число. То же самое даёт =TEXT(A1;»[$-409]dddd»), если нужна именно английская версия без всякой локализации.
=WEEKDAY(A1;2) → 2 (вторник), если в A1 стоит 03.11.2026
=CHOOSE(WEEKDAY(A1;2);"Пн";"Вт";"Ср";"Чт";"Пт";"Сб";"Вс")
=TEXT(A1;"[$-409]dddd") → "Tuesday"
=NETWORKDAYS(A1;B1) → число рабочих дней между датами
=DATEDIF(A1;B1;"d") → интервал в днях одной формулойВ Python всё работает на объектах даты. Метод weekday() нумерует дни от нуля, где ноль это понедельник, а isoweekday() от единицы, где единица это понедельник, то есть ближе к ISO. Вывод strftime(«%A») даёт полное название дня недели на английском, а чтобы получить русское, нужна библиотека локалей или простая таблица на семь элементов. Номер недели по ISO 8601 тоже берётся одной строкой: date.isocalendar() возвращает тройку (год, неделя, день недели).
from datetime import date
d = date(2026, 11, 3)
d.weekday() # 1 → вторник (0 = понедельник)
d.isoweekday() # 2 → ISO: понедельник = 1
d.strftime('%A') # 'Tuesday'
d.timetuple().tm_yday # 307 → номер дня в году
d.isocalendar() # IsoCalendarDate(year=2026, week=45, weekday=2)
# разница в днях между двумя датами
(date(2027, 1, 1) - date(2026, 11, 3)).days # 59В JavaScript с этим есть две тонкости, на которых спотыкаются чаще всего. Первая: конструкция new Date(«2026-11-03») разбирается как полночь по UTC, а метод getDay() смотрит на локальное время, поэтому у пользователя в минусовом поясе день недели получится на единицу меньше. Вторая: в датах, которые переводят локальное время, между двумя полуночами может оказаться 23 или 25 часов, и наивное деление на 86 400 000 даст дробное число. Для календарной арифметики надёжнее работать через Date.UTC.
// День недели: понедельник = 1 ... воскресенье = 7
const iso = (d) => d.getDay() === 0 ? 7 : d.getDay();
iso(new Date(2026, 10, 3)); // 2 (вторник)
// Название дня недели под локаль
new Date(2026, 10, 3).toLocaleDateString("ru-RU", { weekday: "long" });
// → "вторник"
// Разница в днях без привязки к часовым поясам
const a = Date.UTC(2026, 10, 3), b = Date.UTC(2027, 0, 1);
(b - a) / 86400000; // 59Неделя по ISO 8601 и нумерация дней недели
Неделя по ISO 8601 начинается с понедельника, а первая неделя года та, в которой находится первый четверг. Из этого следует правило, которое многих удивляет: 1 января не обязательно принадлежит первой неделе своего года. 1 января 2027 года, например, относится к 53-й неделе 2026 года, потому что в 2026-м было 53 ISO-недели. А первая неделя 2027 года начинается 4 января, в понедельник, и именно с этого дня 2027 год получает первую неделю.
- ISO 8601: понедельник это 1, воскресенье 7, неделя начинается с понедельника;
- ISO 8601: неделя 1 это неделя с первым четвергом, её начало всегда приходится на 4 января или рядом;
- POSIX и strftime: воскресенье это 0, понедельник 1, далее до субботы 6;
- Excel без второго аргумента: воскресенье 1, понедельник 2;
- Excel с типом 3: понедельник 0, воскресенье 6;
- .NET и старые API: воскресенье 0, понедельник 1.
Термин «нулевой день недели» как раз про это расхождение. В Unix-конвенции и в Python функция strftime с параметром %w отдаёт воскресенье как 0, а понедельник как 1, то есть неделя при этом идёт с воскресенья. В ISO 8601 нулевого дня нет, дни пронумерованы с 1. Когда в чужом API попадается поле day_of_week со значениями от нуля, сначала выясните, какая это система нумерации, иначе понедельник превратится в воскресенье, а воскресенье в субботу.
Частые вопросы
Какой день недели был 1 января 2020 года?
Среда. Проверяется это и по формуле Зейлера, и по счёту от 1 января 2026 года, которое было четвергом: между ними ровно шесть лет, из них високосными были 2020-й и 2024-й, то есть 6 × 365 + 2 = 2192 дня, а 2192 mod 7 = 1, значит, день недели сдвинулся на шаг назад от четверга, то есть на среду. Второй ориентир: 1 января 2027 года было пятницей, и до него от Нового 2020 года ровно 2557 дней, а это сдвиг на два дня вперёд от среды, то есть на пятницу.
Почему 29 февраля меняет счёт?
Потому что 29 февраля есть в календаре раз в четыре года и добавляет ровно один день. Если вы считали по правилу «возьми длину предыдущего месяца» и в феврале взяли 28 дней, то все даты с 1 марта и дальше уедут на один день недели. В високосном году правило простое: в феврале 29 дней, значит сдвиг с 29 февраля на 1 марта равен +1, тогда как в обычном году 28 февраля и 1 марта всегда приходятся на один и тот же день недели.
Как считать неделю по ISO 8601?
Неделя начинается в понедельник, а номер первой недели определяется по первому четвергу года: неделя 1 это та, в которую попадает 4 января. Отсюда практическое правило: если 1 января приходится на четверг, пятницу, субботу или воскресенье, то оно принадлежит последней неделе предыдущего года. В 2026 году 1 января было четвергом, значит первая неделя 2026 года началась 29 декабря 2025 года, а в 2026-м получилось 53 недели. Поэтому 1 января 2027 года и записано как 2026-W53-5.
Что такое нулевой день недели?
Это день недели с номером 0, и он есть не во всех системах. В ISO 8601 неделя начинается с понедельника, дни пронумерованы от 1 до 7, нулевого дня там нет. В Unix-конвенции и в Python параметр %w отдаёт воскресенье как 0, а понедельник как 1, то есть неделя идёт с воскресенья. Excel без дополнительных аргументов ведёт себя так же: воскресенье это 1, понедельник 2. Когда в чужом API попадается поле day_of_week с нулями, сначала уточните систему нумерации.
Как узнать день недели для даты в прошлом?
Тем же калькулятором, только в поле вводится прошедшая дата: результат ничем не отличается, алгоритм один и тот же. Можно и вручную: возьмите любую известную опорную дату, например 1 января 2000 года, это суббота, и отсчитайте от неё нужное число дней. Полезный приём: между 1 января 2000 года и 3 ноября 2026 года прошло ровно 9803 дня, а 9803 mod 7 = 3, и суббота плюс три дня это вторник, как и должно быть.
День недели по дате
Узнайте, какой день недели был или будет по любой дате: день года, номер недели по ISO 8601 и високосный ли год
Калькулятор разницы дат
Рассчитайте точную разницу между двумя датами в нескольких единицах
Форматирование дат
Форматируйте даты в различные форматы — ISO 8601, RFC 2822 и пользовательские
Конвертер Unix временных меток
Конвертируйте Unix временные метки в читаемые даты и обратно с живым обновлением