Subject: [Ietf-calsify] Questions regarding details of recurrence rules

From: reinhold at kainhofer.com (Reinhold Kainhofer)
Date: Wed Jun 1 08:33:44 2005

Hi Guys,

I already sent this to ietf-calendar, but didn't get any definitive response 
so far. It may be a bit off-topic here, but I'm still hoping for an answer 
that helps me getting RFC 2445-RRULEs completely correct. For the most part, 
the RFC is clear to me, but there are some details that are not clear. I 
encountered them when I tested my new recurrence implementation which tries 
to implement every aspect of rrules, exrules, rdates and exdates.

The examples below sometimes might look like nitpicking, but I deliberately 
designed them to make little details of the RFC clear.

These issues might be a language problem on my side, or an unclear wording in 
the RFC. In any case, I'd like to know how the RFC really meant those things 
to work. 

1) About the BYDAY rule part: Let's start with some examples
  RRULE:FREQ=YEARLY;BYDAY=3SU
Okay, that's the third sunday of the year. But what exactly is
  RRULE:FREQ=YEARLY;BYDAY=5SU;BYMONTH=2
Is this the fith sunday in the year, if it is also in february? Or is it the
fifth sunday in february? And it can be even less clear from rfc 2445. What
is
  RRULE:FREQ=YEARLY;BYDAY=5SU;BYMONTH=2,7
Is this the fifth sunday of the year, if it's in either February or July?
Or is it the fifth sunday of both february and July?
Or is it the fifth sunday of febrary and july together (i.e. in feb if the
 feb in a leap year has 5 sundays, or the first sunday of july in all other
 years)?

If you think it's the latter, think about the following rule:
  RRULE:FREQ=YEARLY;BYWEEKNO=4;BYDAY=5SU
Is it the fifth sunday of all sundays that are in week #4? Or is it the fifth
sunday of the year if it is also in week #4?

Also, what does this rule mean:
  RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU;BYYEARDAY=72
I suppose it doesn't mean the 72th day of the year, if that's the 2nd sunday
in March (or in the year, using a different interpretation).

Also notice that rfc 2445 says "For example, within
   a MONTHLY rule, +1MO (or simply 1MO) represents the first Monday
   within the month, whereas -1MO represents the last Monday of the
   month. ". So what does
  RRULE:FREQ=MONTHLY;BYYEARDAY=57,64;BYDAY=-1MO
mean? The last monday of each month if it's also day #57 or #64 of the year
(which the quote implies), or the last monday each month in the set of all
days #57 and #64 of the year. In particular, in 2007, would the recurrence
set be Feb 27 (=#57 of the year, and the last monday in february) without any
occurence in march (march 5 is day #64, but it's not the last monday in the
month, since rfc 2445 says -1MO means last monday of the month)? Or would it
be Feb 27 (day #57 of the year, and last monday of all dates that match the
BYYEARDAY in the february interval) and March 4 ( day #64 of the year and
last monday of all dates in March that match the BYYEARDAY).

2) In Section 4.3.10 RFC 2445 says "The COUNT rule part defines the number of
occurrences at which to range-bound the recurrence. The "DTSTART" property
value, if specified, counts as the first occurrence.". So look at this rrule:
DTSTART;TZID=whatever:20050530T120000
RRULE:FREQ=WEEKLY;COUNT=3;BYMONTH=6
The resulting recurrence dates would be
  1) 20050530
  2) 20050630
  3) 20060630

Now if the DTSTART is not specified the quote from above would imply that the
start doesn't count as a recurrence, so looking at
DTEND;TZID=whatever:20050530T150000
DURATION:PT3H
RRULE:FREQ=WEEKLY;COUNT=3;BYMONTH=6
would give the following resulting recurrence dates?
  1) 20050530 (DTSTART is always the first occurence, )
  2) 20050630
  3) 20060630
  4) 20070630 (DTSTART doesn't count towards COUNT)

If it's not meant that way, and an implicit value of DTSTART is also used for 
the count, why does RFC 2445 include the half sentence "if specified"? If 
some incidence doesn't even haven an implicit value of DTSTART, an RRULE 
doesn't make any sense at all.

3) About the DTSTART and recurrence rules: Is the DTSTART always taken to
match the rule (even if it doesn't fulfil the BY* parts)? In particular this
is important for EXRULES: Is the DTSTART always the first occurence of the
EXRULE? If that's the case, the DTSTART will always be excluded as soon as at
least one EXRULE is present.
And since exceptions overrule inclusions, there's no way to have an occurence
on the DTSTART in that case... Is this really the intended behaviour?

Thanks a lot already for your clarifications / discussions.

Cheers,
Reinhold

-- 
------------------------------------------------------------------
Reinhold Kainhofer, Vienna University of Technology, Austria
email: [email-masked], http://reinhold.kainhofer.com/
 * Financial and Actuarial Mathematics, TU Wien, http://www.fam.tuwien.ac.at/
 * K Desktop Environment, http://www.kde.org, KOrganizer / KPilot maintainer