Алгоритм: как проверить пересечения определений повторяющихся событий? - PullRequest
7 голосов
/ 25 мая 2010

Вопрос возникает из поведения календаря MS Outlook.

Представьте, что у меня есть два повторяющихся события (начиная с сегодняшнего дня): "каждый второй понедельник" и "каждая нечетная дата". Есть ли способ проверить пересечения и / или найти первую пересекающуюся дату алгоритмически, без перебора по каждой дате?

Определения могут быть сделаны в нотациях CRON или нотациях ICal. Я думаю, это не имеет значения.

Есть ли решения для этого в григорианском календаре?

UPD : Интересно также узнать, как MS Outlook Calendar обрабатывает эти события. Я имею в виду, как он обнаруживает, что бывший сегодня есть два события? Я полагаю, должна быть методика определения того, подходит ли конкретная дата для определения повторяющегося события.

Формально это можно описать как алгоритм двух функций:

Date:intersection(Event e1, Event e2)
boolean:contains(Date date, Event ev)

Что касается ограничений, мы можем перейти от обозначения определения события. Вы можете видеть в outlook (или iCal), что вы можете определить не такой сложный вид повторяющегося события.

Ответы [ 2 ]

1 голос
/ 25 мая 2010

Если вас беспокоит только то, когда события из разных повторений происходят в один и тот же день, вы можете:

  • Установите какой-нибудь произвольный день в недавнем прошлом как день 1.
  • Выразить каждое повторение как «количество дней» между событиями и днем ​​начала; если ваше событие происходит каждый понедельник и каждый четверг, то выразите это как 2 повторения с 2 днями начала.
  • Используйте соответствующую модульную арифметику, чтобы найти дни, когда события из разных повторений сталкиваются.

Например, если повторения «каждый понедельник» и каждый «5-й день» сталкиваются в 1-й день, то в следующий раз они будут сталкиваться в 36-й, 71-й, 106-й и т. Д. Дни

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

1 голос
/ 25 мая 2010

Поскольку период 1-го повторения составляет 14 дней, четность (нечетная или четная) дня будет меняться только тогда, когда месяц заканчивается нечетным числом: январь, скачок февраль, мар, май, июль, июль, август, октябрь, В течение месяца оно не изменится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...