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

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

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

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

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

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

Официально это может быть описано как два функциональных алгоритма:

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

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

7
задан glaz666 25 May 2010 в 12:15
поделиться

2 ответа

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

1
ответ дан 7 December 2019 в 18:40
поделиться

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

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

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

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

1
ответ дан 7 December 2019 в 18:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: