алгоритм вычисления дня недели по дате

Как определить день недели по дате, не заглядывая в календарь

Чтобы без помощи календаря определить день недели для любой даты, не обязательно быть гением или ясновидящим. Достаточно запомнить пару формул. Заодно это упражнение может стать неплохой тренировкой для ума и памяти.

алгоритм вычисления дня недели по дате. Смотреть фото алгоритм вычисления дня недели по дате. Смотреть картинку алгоритм вычисления дня недели по дате. Картинка про алгоритм вычисления дня недели по дате. Фото алгоритм вычисления дня недели по дате

Для определения дня недели по дате нужно использовать формулу:

Пояснения

Код месяца

Коды месяца и года — это, пожалуй, самое трудное в формуле.

Код месяца нужно просто запомнить.

Чтобы запоминать подобные нелогичные данные, проще всего прибегать к ассоциациям.

Код года

Код года в XXI веке рассчитывается по формуле:

Оператор «/» означает неполное частное, то есть целую часть результата деления.

Если вы захотите узнать день недели для даты другого века, придётся учитывать ещё значения века (6, 4, 2, 0).

Здесь просто: % — оператор остатка при делении.

Расшифровка результата

Старт отсчёта — выходные, то есть: 0 — суббота, 1 — воскресенье и так далее.

Примеры расчёта

Конечно, расчёт дня недели по дате в уме — это не жизненно важный навык в век технологий. Но это нетривиальное упражнение для всех, кто любит развивать свою память и проводить операции с цифрами.

UPD. К сожалению, эта формула не совсем верно работает для високосного года. До 29 февраля включительно к формуле придётся прибавить ещё единицу, чтобы получить верный день. Спасибо читателям, что обнаружили ошибку.

Понравилась статья? Подпишитесь на канал, чтобы быть в курсе самых интересных материалов

Источник

Алгоритм вычисления дня недели

Алгоритм вычисления дня недели

Существует довольно простой алгоритм вычисления дня недели для любой даты григорианского календаря позднее 1583 года. Григорианский календарь начал действовать в 1582 — после 4 октября сразу настало 15 октября.

Положим год — год, месяц — номер месяца, день — день, тогда

Все деления целочисленные (остаток отбрасывается).

Результат: 0 — воскресенье, 1 — понедельник и т. д.

Реализации алгоритма

Для JavaScript код выглядит следующим образом:

Реализация на Delphi:

Реализация в MS SQL:

CREATE FUNCTION [dbo].[getDay]( @date datetime ) RETURNS int AS BEGIN declare @a int declare @y int declare @m int

См. также

Ссылки

Полезное

Смотреть что такое «Алгоритм вычисления дня недели» в других словарях:

Дни недели — Названия дней недели с римского периода были, с одной стороны, связаны с названиями семи планет классической астрономии, а с другой стороны, первым днём недели считалось воскресенье. Обе эти системы были приняты во многих языках, за некоторыми… … Википедия

«Вечный» календарь — Вечный календарь это матрица, позволяющая узнать, на какой день недели приходится любая дата в пределах длительного промежутка времени (как правило, нескольких десятков или сотен лет). Многие из вечных календарей фактически создают сетку… … Википедия

Вечный календарь — Вечный календарь календарь на широкий диапазон лет, предназначенный для определения дня недели. Многие из вечных календарей фактически создают сетку календаря на выбранный месяц выбранного года. Вечные календари могут также использоваться… … Википедия

Список алгоритмов — Эта страница информационный список. Основная статья: Алгоритм Ниже приводится список алгоритмов, группированный по категориям. Более детальные сведения приводятся в списке структур данных и … Википедия

Программируемые алгоритмы — Служебный список статей, созданный для координации работ по развитию темы. Данное предупреждение не устанавл … Википедия

Астрариум — Астрариум, реконструированный итальянским мастером Карло Кроче по описаниям Джованни де Донди[1] Астрариум, так … Википедия

Летнее время — Весенний перевод часовой стрелки с поясного на летнее время … Википедия

12-часовой формат времени — 24 часовой формат 12 часовой формат В устной речи 00:00 (полночь) 12:00* (полночь) Двенадцать (часов) ночи полночь 01:00 1:00 a.m. Час ночи 02:00 2:00 a.m. Два (часа) ночи 03:00 3:00 a.m. Три (часа) ночи 04:00… … Википедия

Устный счёт — Устный счёт. В народной школе С. А. Рачинского. Николай Богданов Бельский. 1895 год. Устный счёт математическ … Википедия

Время суток — Сюда перенаправляется запрос «24 часовой формат времени». На эту тему нужна отдельная статья. Время суток широко используемый на Земле способ исчисления времени, основанный на изменении положения солнца на небе, приблизительно являющемся… … Википедия

Источник

Алгоритм вычисления дня недели по дате

алгоритм вычисления дня недели по дате. Смотреть фото алгоритм вычисления дня недели по дате. Смотреть картинку алгоритм вычисления дня недели по дате. Картинка про алгоритм вычисления дня недели по дате. Фото алгоритм вычисления дня недели по дате

Формула вечного календаря

Формула

Формула вечного календаря позволяет рассчитать день недели, по числу месяцу и году, даже в уме, без использования специальных программ. Формула вечного календаря считает день недели по григорианскому и юлианскому календарю. Входными параметрами календаря являются

d – день месяца

m – месяц. Для марта m=1, для апреля m=2, … для декабря m=10, для января m=11, для февраля m=12. Для месяцев от марта до декабря подставляем месяцы от 1 до 10, для января и февраля подставляем 11 и 12 и считаем их месяцами предыдущего года

y – год в столетии

c – столетие

Для начала введём две функции

[x] – максимальное целое число, не больше чем x. Например, [1.23]=1, [2]=2, [-2.3]=-3.

Днём недели W будет число от 0 до 6. 0 – воскресение, 1 – понедельник, … 6 суббота.

Вычислим день недели 1 января 2000 года по григорианскому календарю. d=1, m=11, y=99, c=19. Поскольку мы рассматриваем месяц январь, то год уменьшается на единицу, так как январь и февраль считаем месяцами предыдущего года. W = (1+[28.4]+[123.75]+[-33.25])%7 = (1+28+123-34)%7 = 118%7 = (7*16+6)%7 = 6 суббота

При небольшой тренировке вполне можно посчитать любой день недели за минуту, что можно демонстрировать как фокус.

Программа

public class Console <

public static void main ( String [] args ) <
int i ;
boolean gregorian ;
final int maxYear = 6000 ;
Random r = new Random ();

Совпадение дней недели по юлианскому и григорианскому календарям

Источник

Вычисление дня недели в уме

алгоритм вычисления дня недели по дате. Смотреть фото алгоритм вычисления дня недели по дате. Смотреть картинку алгоритм вычисления дня недели по дате. Картинка про алгоритм вычисления дня недели по дате. Фото алгоритм вычисления дня недели по датеСуществует множество способов прокачать мозг. Задачи «n-back» или мобильные приложения для тренировки навыка быстрого счета в уме. Но эти задачи оторваны от текущей реальности, а хотелось бы прокачать мозг практичным навыком.

Зачем? Ведь можно быстро посчитать на гаджете. Увы, совсем не быстро, т.к. потребуется время на поиски и активацию гаджета, поиск приложения, ввод даты, осознание полученного результата. А еще можно друзей/подруг порадовать своими внезапно появившимися экстраординарными способностями. Кстати, друзья быстро осознают удобство использования вечного календаря с голосовым интерфейсом.

Разве это возможно? Как-то раньше обходились без компьютеров. В одной из тв-передач «ищем таланты» показывали натренированного трехлетнего ребенка, который может вычислять произведение трехзначных чисел (пощадите своих детей). Впрочем, взрослые уже не дети и их мозг частично кристаллизован, в смысле слабо обучаем. Значит нужно запоминать как можно меньше и максимально задействовать имеющиеся навыки.

В алгоритмике часто объемы вычислений могут быть скомпенсированы объемами памяти. Т.е. чем больше оперативки доступно, тем меньше потребуется вычислений. Аналогично работает мозг – чем больше мы запомнили, тем быстрее ищем решение. Запомнили несколько формул для сборки кубика Рубика – соберете за пару минут (после длительной тренировки). Запомнили полторы сотни формул – соберете за пару десятков секунд. Мировой рекорд 2013 года – 8.18 сек. Еще раз: чем больше помним – тем быстрее решение.

Алгоритм

Нужно взять смещение (день недели) первого дня года (y) и смещение месяца (m). Затем вычислить сумму y+m+d, где d – день месяца, и найти остаток от деления на 7. Получим номер дня недели.

Что нужно запомнить

В целом, достаточно запомнить все дни недели всех 28 лет (периодичность пропорциональна произведению периодов високосных лет и дней недели). Последовательность в 10k. Это довольно много.

Если добавить одну операцию сложения, то будет достаточно запомнить лишь пару рядов чисел:

m(month) = < 6 2 2 5 0 3 5 1 4 6 2 4 >, с января по декабрь

Например: 13 сентября 2013 = (13 + 4 + 2) % 7 = 5 (пятница)

Смещения для месяца берутся из календаря некоторого года. Смещение месяца равно количеству серых квадратов в начале месяца. Например, не високосный 2006 год. Смещение для этого года будет 0.

алгоритм вычисления дня недели по дате. Смотреть фото алгоритм вычисления дня недели по дате. Смотреть картинку алгоритм вычисления дня недели по дате. Картинка про алгоритм вычисления дня недели по дате. Фото алгоритм вычисления дня недели по дате

Все же запомнить смещения для всех лет и затем выполнять быстрый поиск по индексу довольно сложная когнитивная задача. Есть альтернативный путь – вычислить. Нужно взять две последние цифры года (+100 для XXI века) — Y. Далее найти ближайший прошлый високосный Yв. Взять dY = Y – Yв. Тогда смещение года можно вычислить

Недостаток формулы в том, что для 2004 и далее смещение будет отрицательным, а для начала и середины XX века двузначными, что слегка затрудняет вычисления в уме. Можно использовать разные формулы для каждого века, в которых учитываются только две младшие цифры года. Например, 12 для 2012г и 1912г.

XX: (50 – Yв/2 + dY) % 7 или (8 – Yв/2 % 7 + dY)
XXI: (7 – Yв/2 % 7 + dY)

В итоге может оказаться проще запомнить таблицу смещений в таком виде:

алгоритм вычисления дня недели по дате. Смотреть фото алгоритм вычисления дня недели по дате. Смотреть картинку алгоритм вычисления дня недели по дате. Картинка про алгоритм вычисления дня недели по дате. Фото алгоритм вычисления дня недели по дате

Например, для 2014 смещение будет y(2014) = y(2012) + 2 = 1 + 2 = 3. А день программиста 13 сентября 2014 года будет (y(2014) + m(сен) + 13) = (3 + 4 + 13) = 20 => 20 % 7 = 6, т.е. суббота.

Структурируем ряд смещений для месяцев. Значения удобно запоминать по сезонам: весна, лето, осень, зима.

алгоритм вычисления дня недели по дате. Смотреть фото алгоритм вычисления дня недели по дате. Смотреть картинку алгоритм вычисления дня недели по дате. Картинка про алгоритм вычисления дня недели по дате. Фото алгоритм вычисления дня недели по дате

Обратите внимание, что вдруг (?), в порядке сверху вниз и слева направо, цифры выстроились в возрастающий ряд (первая цветная таблица). Можно запоминать только остатки от деления на 7 (вторая цветная таблица) или для восстановления всей таблицы запомнить только разности (последняя таблица). Прибавляя 1 к 1, получим для марта 2, для июня 2+1=3, для сентября 3+1=4 и т.д. Одинаковые значения раскрашены в одинаковые цвета. Для быстрого поиска нам поможет вторая цветная таблица. Помним, что строки — это сезоны, начиная с весны. Это крайне непривычно. Но в древнем Риме год начинался именно с марта. Это отражено в названиях месяцев латинскими цифрами: September/October/November/December – 7/8/9/10, т.е. февраль был последним 12м месяцем года, к которому добавляли високосный день.

алгоритм вычисления дня недели по дате. Смотреть фото алгоритм вычисления дня недели по дате. Смотреть картинку алгоритм вычисления дня недели по дате. Картинка про алгоритм вычисления дня недели по дате. Фото алгоритм вычисления дня недели по дате

12 апреля 1961 года: (6 + 1 + 5 + 12) = (0 + 5 + 12) => 17 % 7 = 3 – среда.

Важно. У программистов вечная проблема с потерянной единицей. В нашей задачке без этого не обошлось. Для января и февраля високосного года нужно вычитать единицу.

14 февраля 2012 = (y(2012)+m(фев)+14) — 1 = (1 + 2 +14) — 1 => 16 % 7 = 2, т.е. вторник.

Еще нужно помнить, что не все года что делятся на 4 будут високосными (исключения — 2100, 1900, 1800, ….). Соответственно, необходимо учесть смещение для века. Впрочем, даже если не учитывать последнее исключение можно безошибочно оперировать днями недели за XX и XXI века, что достаточно для большинства житейских случаев.

Немного оптимизации.

Вычисления можно производить в потоковом режиме. Обычно дату рождения (или любую другую дату) сообщают начиная с дня месяца, например, 23 декабря 1913 года. Т.е. в процессе сообщения даты можно частично вычислить искомую сумму 23 + m(дек) = 27 или даже 23 % 7 + m(дек) = 2 + 4 = 6 и затем уже задуматься y(1913) = y(1912) + 1 = 3. В итоге сообщить 30 % 7 = (6 + 3) % 7 = 2, вторник.

Часто приходится оперировать датами текущего года. Т.е. смещение года вы всегда будете помнить, т.к. от частого использования значение «закэшируется». Например, для 2014 смещение равно 3.

Что мы получили. Правила заполнения таблиц простые и вы скорее всего их запомнили и сможете воспроизвести себе шпаргалку в любом месте в любое время. Но для быстрого счета таблицы проще заучить целиком. Ведь мы не восстанавливаем таблицы сложения и умножения для расчета сдачи перед кассой. Эти таблицы «прошиты» еще в начальной школе. Для запоминания таблиц легче всего воспользоваться тренажером Week Brain Calc (Windows Phone).

После непродолжительной тренировки можно порадовать любимых своими уникальными способностями.

Источник

Тренируем мозги (ВЫЧИСЛЕНИЕ ДНЯ НЕДЕЛИ ПО ДАТЕ)

Одно из самых простых и действенных упражнений для тренировки памяти в любом возрасте – это устный счет. Можно придумать много различных вариантов тренировки устного счета, но здесь очень важным моментом выступает интерес к данным упражнениям и результату вычислений.

Предлагаем для тренировки упражнение по вычислению дня недели по конкретной дате.

С одной стороны, это может пригодиться в конкретной ситуации, чтобы быстро определить в какой день недели родились Вы или Ваши знакомые, или в какой день недели был Ваш предыдущий День рождения или будет следующий День рождения. А может и немного удивить вашего собеседника, сообщив ему, что он родился в какой-то конкретный день недели.

С другой стороны, это не простое упражнение только на сложение или вычитание. Здесь нужно будет в уме, и делить, и складывать, и подставлять определенные числа вместо значений месяца. Переходим к алгоритму такого вычисления.

ВЫЧИСЛЕНИЕ ДНЯ НЕДЕЛИ ПО ДАТЕ

Рассмотрим сначала четыре основных параметра для расчетов.

Возьмем дату — 20.11.1957 года

1. Индекс года:

Годовой индекс рассчитывается таким образом, что две последние цифры года делятся на 12. Например, из года 1957 берется число 57. Это число де­лится на 12, получается 4 и 9 в остатке.

Остаток делится на 4. В нашем при­мере получается остаток 9, который при делении на 4 дает 2 и 1 в остатке, однако здесь остаток не учитывается.

Три полученных числа складываются. Итак, 4 плюс 9 плюс 2, получится 15.

2. Индекс месяца:

Каждому месяцу присваивается свой индекс, который просто нужно запомнить.

Месяц | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |

Индекс | 6 | 2 | 2 | 5 | 0 | 3 | 5 | 1 | 4 | 6 | 2 | 4 |

3. Индекс века:

Для годов, начинающихся с «одна тысяча девятьсот…» прибавляется + 1

Для годов, начинающихся с «две тысячи…» ничего не прибавляется

4. Индекс високосного года:

Еще есть дополнительное правило для високосных годов, которые можно уз­нать по тому, что две последние цифры года без остатка делятся на 4.

Если исход­ная дата относится к январю или февралю високосного года, тогда из итогового числа необходимо отнять – 1

Рассмотрим несколько конкретных примеров.

1. Вычислим день недели для даты 20.11.1957 года

Сложим все индексы:

Индекс года — 15 (4+9+2)

Итак, 15 плюс 2 плюс 20 плюс 1, получится 38.

Результат делится на 7, в нашем случае 38 делить на 7 равно 5 и 3 в ос­татке.

Неделя начинается с понедельника, это число 1, а число 3 соответствует среде.

Итого: 20.11.1957 года – это среда.

2. Вычислим день недели для даты 10.02.1928 года

Сложим все индексы:

Индекс года – 7 (2+4+1)

Индекс високосного года – (-1)

Итак, 7 плюс 2 плюс 10 плюс 1 минус 1, получится 19.

Результат делится на 7, в нашем случае 19 делить на 7 равно 2 и 5 в ос­татке.

Неделя начинается с понедельника, это число 1, а число 5 соответствует пятнице.

Итого: 10.02.1928 года – это пятница.

3. Вычислим день недели для даты 15.06.2012 года

Сложим все индексы:

Итак, 15 плюс 3 плюс 1, получится 19.

Результат делится на 7, в нашем случае 19 делить на 7 равно 2 и 5 в ос­татке.

Неделя начинается с понедельника, это число 1, а число 5 соответствует пятнице.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *