Определение дня недели по дате
Доступный в понимании, наиболее простой и быстрый инструмент, позволяющий рассчитать день недели по дате. Все вычисления проводятся в режиме реального времени. Вам нужно только ввести исходное значение.
Принцип работы
Высчитывать вручную день недели, соответствующий определенной календарной дате, достаточно сложно. Нужно иметь под рукой несколько календарей за разные годы, но даже в этом случае нельзя быть застрахованным от допущения ошибок. Если вы хотите быть уверены в точности результата, при этом вам критически важна высокая скорость расчетов, то непременно воспользуйтесь нашим онлайн-сервисом.
Порядок действий, как вычислить день недели по дате, предельно простой:
- в предложенных окнах введите вручную исходные данные: число, месяц, год, век (также можно подставлять значения из выпадающего меню);
- нажмите на кнопку «Рассчитать» – так вы активируете функцию вычисления.
В нижней части формы появится итоговое значение.
Пример: Исходные данные – 19 сентября, 2009 года. Полученный результат после вычислений на калькуляторе – дата выпала на воскресенье.
Все расчеты происходят автоматически, поэтому вам ничего не нужно самостоятельно контролировать. Главное – правильно ввести изначальные параметры. На основании них сервис мгновенно выведет ответ.
Пользоваться инструментом допускается без ограничений, не нужно регистрироваться, авторизовываться. Все расчеты проводятся бесплатно.
Как вычислить день недели по дате
Формула вечного календаря позволяет рассчитать день недели, по числу месяцу и году по григорианскому и юлианскому календарям.
[x] – максимальное целое число, не больше чем x. Например, [1.23]=1, [2]=2, [-2.3]=-3.
x%y — остаток от x при делении на y (лежит в диапазоне от 0 до y-1), где x и y целые числа (y>0). Например, 9%7 = (2+7*1)%7 = 2, (-9)%7 = (5-2*7)%7 = 5.
Днем недели будет число W от 0 до 6, где 0 — воскресенье, 1 — понедельник, 2 — вторник. 6 — суббота.
Первая формула
Доказательство
Зависимость дня недели от дня
День недели изменяется по циклу от 0 до 6, и каждый день прибавляет единицу ко дню недели, поэтому W = (d+M(m)+Y(Y)) % 7, где M и Y некоторые функции месяца и года.
Зависимость дня недели от месяца
Найдем M(1). M(12), где 1 — март, 2 — апрель, 3 — май, 10 — декабрь, 11 — январь, 12 — февраль. Выведем рекуррентную зависимость M(m+1) от M(m). Каждый месяц содержит 30 или 31 день, февраль будет последним в последовательности m=12 и поэтому действительно каждый месяц содержит 30 или 31 день. Если предыдущий месяц содержит 30 дней, то он добавит 30 дней или 2 по модулю 7, если содержит 31 день, то добавит 3 дня по модулю 7. 1 марта нулевого года — это среда по григорианскому календарю, поэтому W = (1+M(1))%7=3 или M(1)=2. Теперь можно получить M(2) для апреля, так как март содержит 31 день, то M(2)=M(1)+3=5. Найдем M(3) для мая, предыдущий месяц апрель содержит 30 дней поэтому M(3)=M(2)+2=7=0 mod 7. Аналогично можно найти все остальные значения M
Предполагая, что M(m)=[(a*m+b)/c] можно перебором найти, что M(m)=[(13*m-1)/5].
Зависимость дня недели от года для юлианского календаря
Каждый год может быть високосным, то есть содержать 366 дней или невисокосным — содержать 365 дней. 365=350+14+1=7*50+7*2+1=1 mod 7, то есть каждый невисокосный год прибавляет 1 по модулю 7 к дню недели, а каждый високосный год прибавляет 2. В юлианском календаре каждый год делящийся на 4 будет високосным, остальные невисокосные. Каждый год в любом случае будет прибавлять 1 и каждый год делящийся на 4 будет прибавлять дополнительно еще 1. Отсюда получаем формулу Y(Y)=Y+[Y/4].
Зависимость дня недели от года для григорианского календаря
Аналогично с юлианским календарем каждый високосный год прибавляет 2, а каждый невисокосный 1. Год будет високосным тогда и только тогда когда Y делится на 4 и (Y делится на 400 или Y не делится на 100). Если мы вычтем [Y/100] из формулы Y(Y)=Y+[Y/4], то есть рассмотрим выражение Y+[Y/4]-[Y/100], то все года делящиеся на 100 станут невисокосными, а если добавим [Y/400], то есть Y(Y)=Y+[Y/4]-[Y/100]+[Y/400], то все года делящиеся на 100, но не делящиеся на 400 останутся невисоксными, а года делящиеся на 400 станут високосными.
Можно проверить это и другим способом. Рассмотрим год делящийся на 100, y=100*k, где k некое целое число, тогда прирост от года y будет равен Δy=Y(y)-Y(y-1) = y-(y-1)+[y/4]-[(y-1)/4]-([y/100]-[(y-1)/100])+[y/400]-[(y-1)/400] = 1+25k-(25k-1)-(k-(k-1))+[k/4]-[(k-1)/4] = 1+[k/4]-[(k-1)/4]. Если k не кратно четырем, то Δy = 1+[k/4]-[(k-1)/4] = 1+[(k-1)/4]-[(k-1)/4] = 1, то есть если год делится на 100, но не делится на 400, то он даст прирост 1, то есть считается как невисокосный. Если же k кратно четырем, то Δy = 1+[k/4]-[(k-1)/4] = 1+[(k-1)/4]+1-[(k-1)/4] = 2, то есть если год делится на 400, то он даст прирост 2, то есть считается как високосный год.
Дополнительный сдвиг для юлианского календаря
1 марта нулевого года — это понедельник по юлианскому календарю, и среда по григорианскому календарю, поэтому нужно добавить 5 в формулу дня недели по юлианскому календарю, так как к среде нужно добавить 5 дней чтобы получился понедельник.
Примеры
Вычислим день недели для 2 марта 2008 года по григорианскому и юлианскому календарю. d=2, m=1, Y=2008. Подставим эти данные в формулу
Григорианский календарь W = (2+[(13-1)/5]+2008+[2008/4]-[2008/100]+[2008/400])%7 = (2+2+2008+502-20+5)%7 = 2499%7 = (356*7)%7 = 0, то есть это воскресение.
Юлианский календарь W = (2+[(13-1)/5]+2008+[2008/4]+5)%7 = (2+2+2008+502+5)%7 = 2514%7 = (7*359+6)%7 = 6 — суббота.
Вычислим день недели 1 января 2000 года по григорианскому и юлианскому календарю. d=1, m=11, Y=1999. Поскольку мы рассматриваем месяц январь, то год уменьшается на единицу, так как январь и февраль считаем месяцами предыдущего года.
Григорианский календарь W = (1+[(13*11-1)/5]+1999+[1999/4]-[1999/100]+[1999/400])%7 = (1+28+1999+499-19+4)%7 = 2512%7 = (7*358+6)%7 = 6 — суббота.
Юлианский календарь W = (1+[(13*11-1)/5]+1999+[1999/4]+5)%7 = (1+28+1999+499+5)%7 = (7*361+5)%7 = 5 — пятница.
Вторая формула
Для вычисления дня недели в уме лучше пользоваться формулой, где полный год Y разбит на два параметра c — столетие и y — год в столетии
Доказательство
Зависимость дня недели от дня и месяца была доказана при выводе первой формулы.
Зависимость дня недели от года внутри века
Внутри века любой год високосный, если он делится на 4, то есть y входит так же как и полный год Y в первую формулу по юлианскому календарю. Отсюда получаем, что y входит в формулу как y+[y/4].
Зависимость дня недели от столетия для юлианского календаря
Каждое столетие это 100 лет причем года делящиеся на 4 будут високосными 0, 4, 8. 96, а остальные невисоксными. Получаем, что будет 25 високосных лет и 75 невисокосных. Как доказывалось выше каждый високосный год добавляет 2, а невисокосный 1. Таким образом получаем, что каждое столетие добавит 125 дней. 125=-1 mod 7, отсюда получаем, что столетие входит в формулу как -c.
Зависимость дня недели от столетия для григорианского календаря
Если столетие кратно четырем, то оно добавит 125 дней, как в юлианском календаре. Если же столетие не кратно четырем, то отличие будет в том, что нулевой год станет невисокосным и получем, что столетие добавит 124 дня или -2 mod 7. То есть любое столетие даст -2 дня по модулю 7 плюс каждое столетие делящееся на 4 даст дополнительно 1 день. Получаем, что столетие входит в формулу как [c/4]-2c.
Примеры
Вычислим день недели для 2 марта 2008 года. d=2, m=1, y=8, c=20. Подставим эти данные в формулу
Григорианский календарь W = (2+[(13-1)/5]+8+[8/4]+[20/4]-40)%7 = (2+2+8+2+5-40)%7 = -21%7 = 0 — воскресение.
Юлианский календарь W = (2+[(13-1)/5]+8+[8/4]+5-20)%7 = (2+2+8+2+5-20)%7 = (-1)%7 = 6 — суббота.
Вычислим день недели 1 января 2000 года. d=1, m=11, y=99, c=19. Поскольку мы рассматриваем месяц январь, то год уменьшается на единицу, так как январь и февраль считаем месяцами предыдущего года.
Григорианский календарь W = (1+[(13*11-1)/5]+99+[99/4]+[19/4]-2*19)%7 = (1+28+99+24+4-38)%7 = 118%7 = (7*16+6)%7 = 6 — суббота.
Юлианский календарь W = (1+[(13*11-1)/5]+99+[99/4]+5-19)%7 = (1+28+99+24+5-19)%7 = 138%7 = (7*19+5)%7 = 5 — пятница.
Вычисление дня недели в уме
- Вместо того, чтобы вычислять [(13m-1)/5] можно просто запомнить таблицу соответствия Проще запоминать таблицу по сезонам: для весны число 250, для лета 351, осени 462 и зимы 403.
- Очень часто надо вычислять дни недели текущего года, поэтому вместо того, чтобы каждый раз делать вычисления, можно просто сделать их один раз. Например, пусть текущий год 2008, тогда для всех месяцев с марта 2008 по февраль 2009 года будут использоваться одни и те же параметры y=8, c=20. Поэтому можно посчитать (y+[y/4]+[c/4]-2c)%7 = (8+2+5-40)%7 = 3. Теперь легко подсчитать день недели второго марта 2008 года. Для марта берем значение из таблицы – это 2, для 2008 года добавка 3, осталось прибавить день d=2. Итого (2+2+3)%7=0 — воскресение.
- Практически всегда нужно найти дни недели для двадцатого — c=19 и двадцать первого веков — c=20. Для них можно сразу вычислить величину ([c/4]-2c)%7 и потом уже не считать. Для c=19 получаем (4-38)%7=1, для с=20 (5-40)%7=0.
- Внутри века год y можно уменьшать на число кратное 28, то есть на 28, 56, 84 результат останется тем же, но считать день недели будет проще.
- День можно брать по модулю 7 — день недели останется тот же.
При небольшой тренировке можно посчитать день недели в уме, что можно демонстрировать как фокус.
Программа
Деление целого числа на целое в java и c++ x/y не всегда совпадает с функцей [x/y], также оператор взятия остатка x%y не всегда совпадает с остатком в математике (хотя если x≥0 и y>0, то будет совпадать). Например, в java -7/4=-1, а [-7/4]=-2 и в java -7%4=-3, а в математике -7%4=1. Поэтому для операции [x/y] берется функция Math.floorDiv(x, y), а для операции x%y функция Math.floorMod(x, y), чтобы формула работала со всеми, в том числе и с отрицательными, годами. Если нужны будут только даты с 1 марта 0 года, то можно использовать операторы / и %, но нужно помнить что остаток от деления отрицательного числа на 7 может быть отрицательным, в этом случае нужно прибавить 7. В языках где функций floorDiv и floorMod нет, например с++, можно использовать такой код
int floorDiv ( int x , int y ) <
return floor ( double ( x ) / y );
>
int floorMod ( int x , int y ) <
return x — y * floorDiv ( x , y );
>
Ниже предоставлен текст программы на языка java, проверяющий формулы вычисления дня недели.
import java . util . Calendar ;
import java . util . GregorianCalendar ;
import java . util . Random ;
public class Console <
/**
* calculating week day support negative years
*
* @param day — day of the month
* @param month — month of the year. 1 — January, 2 — February etc.
* @param year — year
* @param gregorian If true use Gregorian calendar else use Julian calendar
* @return week day 0 — Sunday, 1 — Monday etc.
*/
static int weekDay ( int day , int month , int year , boolean gregorian ) <
if ( month > 2 ) <
month -= 2 ;
> else <
month += 10 ;
year —;
>
int y = year ;
return Math . floorMod ( day + ( 13 * month — 1 ) / 5 + y + Math . floorDiv ( y , 4 )
+ ( gregorian ? Math . floorDiv ( y , 400 ) — Math . floorDiv ( y , 100 ) : 5 ), 7 );
>
static int weekDay1 ( int day , int month , int year , boolean gregorian ) <
if ( month > 2 ) <
month -= 2 ;
> else <
month += 10 ;
year —;
>
int c = Math . floorDiv ( year , 100 );
int y = Math . floorMod ( year , 100 );
return Math . floorMod (
day + ( 13 * month — 1 ) / 5 + y + y / 4 + ( gregorian ? Math . floorDiv ( c , 4 ) — 2 * c : 5 — c ),
7 );
>
public static void main ( String [] args ) <
int i ;
boolean gregorian ;
final int maxYear = 6000 ;
Random r = new Random ();
GregorianCalendar calendar [] = new GregorianCalendar [ 2 ];
i = 0 ;
for ( GregorianCalendar c : calendar ) <
gregorian = c == calendar [ 0 ];
c = calendar [ i ++] = new GregorianCalendar ();
c . setGregorianChange ( new GregorianCalendar ( gregorian ? 0 : maxYear + 1 , 1 , 1 ). getTime ());
>
for ( i = 0 ; i < 10000 ; i ++) <
int year = 1 + r . nextInt ( maxYear — 1 );
int month = 1 + r . nextInt ( 12 );
int day = 1 + r . nextInt ( 28 );
for ( GregorianCalendar c : calendar ) <
gregorian = c == calendar [ 0 ];
c . set ( year , month — 1 , day );
if ( c . get ( Calendar . DAY_OF_WEEK ) — 1 != weekDay ( day , month , year , gregorian )) <
System . err . println ( «error » + day + » » + month + » » + year + » » + gregorian );
return ;
>
if ( weekDay ( day , month , year , gregorian ) != weekDay1 ( day , month , year , gregorian )) <
System . err . println ( «error1 » + day + » » + month + » » + year + » » + gregorian );
return ;
>
>
>
Совпадение дней недели по юлианскому и григорианскому календарям
Формулы юлианского и григорианского календарей различаются добавкой, связанной со столетием. Для юлианского календаря эта добавка равна 5-с, для григорианского [c/4]-2c. Так как в конце результат берется по модулю 7, то достаточно решить уравнение 5-с = [c/4]-2c mod 7. Очевидно, что если c решение уравнения, то и c+28k тоже будет решением уравнения если k — целое число. Таким образом можно, воспользовавшись перебором от 0 до 27 найти решения. Этими решениями будут числа: 2, 11, 12 и 21. То есть дни недели по юлианскому и григорианскому календарю будут совпадать, тогда и только тогда, когда c=n+28k, где n — одно из чисел <2, 11, 12, 21>, k — любое целое число.
Уравнение 5-с = [c/4]-2c mod 7 можно решить и без перебора. Перепишем его в виде [c/4]=5+c mod 7. Пусть c=4a+b где b число от нуля до трех. Тогда получаем уравнение a=5+4a+b mod 7 или 3a=-b-5 mod 7. Так как мы ищем решения по модулю 7, то к правой части уравнения можно добавить любое число кратное 7. Добавим 7b+14, получим 3a=-b-5+7b+14=6b+9 mod 7, отсюда a=2b+3, с=4a+b=9b+12 подставим значения b от 0 до 3, и будем брать значения по модулю 28, получим
Подскажите как узнать по дате день недели (формула вечного календаря)
где d — число месяца;
m — номер месяца, начиная с марта (март=1, апрель=2, ..февраль=12);
y — номер года в столетии (например, для 1965 года y=65. Для января и февраля 1965 года, т. е. для m=11 или m=12 номер года надо брать предыдущий, т. е. y=64);
c — количество столетий (например, для 2000 года c=20. И здесь для января и февраля 2000 года надо брать предыдущее столетие с=19);
квадратные скобки означают целую часть полученного числа (отбрасываем дробную) .
Результат W делите на 7 и модуль остатка от деления даст день недели (воскресенье=0, понедельник=1, ..суббота=6)
Пример: для 31 декабря 2008 года определяем:
d=31, m=10, y=8, c=20
По формуле находим:
W = 31 + [ ( 13 * 10 — 1 ) / 5 ] + 8 + [ 8 / 4 ] + [ 20 / 4 ] — 2 * 20 =
= 31 + 25 + 8 + 2 + 5 — 40 = 31
Теперь делим W на 7 и находим остаток от деления: 31 / 7 = 4 и 3 в остатке.
Тройка соответствует дню недели СРЕДА.
Как определить день недели по дате, не заглядывая в календарь
Для определения дня недели по дате нужно использовать формулу:
день недели = (день + код месяца + код года) % 7
Пояснения
Код месяца
Коды месяца и года — это, пожалуй, самое трудное в формуле.
Код месяца нужно просто запомнить.
- 1 — январь, октябрь;
- 2 — май;
- 3 — август;
- 4 — февраль, март, ноябрь;
- 5 — июнь;
- 6 — декабрь, сентябрь;
- 0 — апрель, июль.
Чтобы запоминать подобные нелогичные данные, проще всего прибегать к ассоциациям.
Код года
Код года в XXI веке рассчитывается по формуле:
код года = (6 + последние две цифры года + последние две цифры года / 4) % 7
Оператор «/» означает неполное частное, то есть целую часть результата деления.
- 2015 год: (6 + 15 + 15 / 4) % 7 = (6 + 15 + 3) % 7 = 24 % 7 = 4;
- 2016 год: (6 + 16 + 16 / 4) % 7 = (6 + 16 + 4) % 7 = 26 % 7 = 5;
- 2017 год: (6 + 17 + 17 / 4) % 7 = (6 + 17 + 4) % 7 = 27 % 7 = 6;
- 2026 год: (6 + 26 + 26 / 4) % 7 = (6 + 26 + 6) % 7 = 38 % 7 = 3.
Если вы захотите узнать день недели для даты другого века, придётся учитывать ещё значения века (6, 4, 2, 0). Вместо 6 для ближайших веков будут следующие значения:
- 16хх: 6;
- 17хх: 4;
- 18хх: 2;
- 19хх: 0;
- 20хх: 6;
- 21хх: 4 и так далее.
Здесь просто: % — оператор остатка при делении.
Расшифровка результата
Старт отсчёта — выходные, то есть: 0 — суббота, 1 — воскресенье и так далее.
Примеры расчёта
- 25 июля 2016 года: (25 + 0 + 5) % 7 = 30 % 7 = 2 — понедельник;
- 8 августа 2017 года: (8 + 3 + 6) % 7 = 17 % 7 = 3 — вторник;
- 5 января 2127 года:
- (4 + 27 + 27 / 4) % 7 = (4 + 27 + 3) % 7 = 34 % 7 = 6 — код года;
- (5 + 1 + 6) % 7 = 10 % 7 = 5 — четверг.
Конечно, расчёт дня недели по дате в уме — это не жизненно важный навык в век технологий. Но это нетривиальное упражнение для всех, кто любит развивать свою память и проводить операции с цифрами.
UPD. К сожалению, эта формула не совсем верно работает для високосного года. До 29 февраля включительно к формуле придётся прибавить ещё единицу, чтобы получить верный день. Спасибо читателям, что обнаружили ошибку.