views:

63

answers:

2

The question comes from MS Outlook calendar behavior.

Imagine I have two recurring events (starting from today): "each second Monday" and "every odd date". Is there any way to check intersections and/or find the first intersecting date algorithmically without brute-forcing over each date?

Definitions can be made in CRON's notations or ICal notation. I think it doesn't matter.

Are there any solutions for this in Gregorian calendar?

UPD: It is also interesting to know how MS Outlook Calendar handles these events. I mean how it discovers that ex. today has two events? I guess should be also technique for determination of whether concrete date suits recurring event definition.

Formally it can be described as two function algorithm:

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

Regarding restrictions, we can go from event definition notation. You can see in outlook (or iCal), that you can define not that complex kind of recurring event.

+1  A: 

Since the period for the 1st recurrence is 14 days, parity (odd or even) of the day will only change when the month ends in an odd number: Jan, leap Feb, Mar, May, Jul, Aug, Oct, Dec. During a month it will not change.

James
this is just an example of two events. What about "each Mon, We, Fr" and etc. Should be universal solution
glaz666
There could not be a "universal" solution, since on the conditions of the recurrence would change the logic significantly. Unless of course your universe is limited to certain types, but it is not specified.
James
+1: I've upvoted this: sure it only tackles one special case but it wasn't hard to generalise from.
High Performance Mark
A: 

If you are only concerned about when events from different recurrences occur on the same day you could:

  • Establish some arbitrary day in the recent past as day 1.
  • Express each recurrence as a 'number-of-days' between events and a start day; if your event occurs every Monday and every Thursday then express this as 2 recurrences with 2 start days.
  • Use appropriate modular arithmetic to find days when the events from different recurrences collide.

Eg if recurrences 'every Monday' and every '5th day' both collide on day 1, they will next collide on the 36th, 71st, 106th, etc days

If you want something more precise you would need to measure not in whole days but in whatever fraction of a day you are interested in.

High Performance Mark