Вопрос прибывает из календарного поведения MS Outlook.
Предположите, что у меня есть два повторяющихся события (запускающийся с сегодняшнего дня): "каждый второй понедельник" и "каждая нечетная дата". Там какой-либо путь состоит в том, чтобы проверить пересечения и/или найти первую дату пересечения алгоритмически без принуждения скота по каждой дате?
Определения могут быть сделаны в нотациях КРОНА или нотации ICal. Я думаю, что это не имеет значения.
Есть ли какие-либо решения для этого в Григорианском календаре?
UPD: также интересно знать, как Календарь MS Outlook обрабатывает эти события. Я имею в виду, как это обнаруживает это напр. сегодня имеют два события? Я предполагаю, должна быть также техника для определения того, удовлетворяет ли конкретная дата определению повторяющегося события.
Официально это может быть описано как два функциональных алгоритма:
Date:intersection(Event e1, Event e2)
boolean:contains(Date date, Event ev)
Относительно ограничений мы можем пойти из нотации определения события. Вы видите в перспективе (или iCal), который можно определить не что сложный вид повторяющегося события.
Поскольку период первого повторения составляет 14 дней, четность (нечетная или четная) дня изменится только тогда, когда месяц закончится нечетным числом: январь, високосный февраль, март, май, июль, август, октябрь, Декабрь. В течение месяца не изменится.
Если вас интересует только то, когда события из разных повторений происходят в один и тот же день, вы можете:
Например, если рекуррентные события "каждый понедельник" и "каждый 5-й день" сталкиваются в день 1, то в следующий раз они столкнутся на 36-й, 71-й, 106-й и т.д. дни
Если вы хотите чего-то более точного, то вам нужно измерять не в целых днях, а в любой интересующей вас доле дня.