ietf-corpus

rfc-7529

Non-Gregorian Recurrence Rules in the Internet Calendaring and Scheduling Core Object Specification (iCalendar)

C. Daboo, G. Yakushev
date2015-05 streamIETF areaart wgcalext statusPROPOSED STANDARD pages21 canonicalhttps://www.rfc-editor.org/rfc/rfc7529 doi10.17487/RFC7529
This document defines extensions to the Internet Calendaring and Scheduling Core Object Specification (iCalendar) (RFC 5545) to support use of non-Gregorian recurrence rules. It also defines how Calendaring Extensions to WebDAV (CalDAV) (RFC 4791) servers and clients can be extended to support these new recurrence rules.

updates

Extracted elements (26)

design-rationale §1

Rather than using the existing CALSCALE property (which applies globally to all components), this specification keeps CALSCALE=GREGORIAN and adds RSCALE per-RRULE. This allows mixing events from different calendar systems in the same iCalendar object and avoids conflicts with VTIMEZONE components that inherently use Gregorian dates.

design-rationale §4.1

The SKIP element was introduced because the existing iCalendar behavior of silently ignoring invalid recurrence dates (e.g., a birthday on Feb 29 appearing only in leap years) is often surprising to users. Common human conventions for resolving such dates differ by calendar system and event type, necessitating an explicit user-controlled policy.

design-rationale §5

The specification reuses the Unicode Consortium's CLDR calendar system registry rather than creating a new IANA registry. This is justified because most implementations of non-Gregorian calendars will use the Unicode ICU library, making CLDR reuse natural and reducing divergence.

registry

interoperability-note §6

Calendar user agents that do not support RSCALE may: (1) reject the entire iCalendar object, (2) reject only the components with the unrecognized RSCALE (and associated overridden components sharing the same UID), or (3) treat the component as non-recurring. Option (2) is recommended as least disruptive.

interoperability-note §5

RSCALE values are case insensitive, but uppercase is the preferred form. The underscore character '_' is never used in CLDR-based calendar system names. CLDR alias values may be used as RSCALE values and are treated equivalently to the calendar system they alias.

interoperability-note §4.2

The Hebrew calendar as implemented by Unicode ICU uses a 1–13 month numbering scheme where month 6 is the leap month. ICU months 1–5 map to iCalendar months 1–5, ICU month 6 maps to iCalendar '5L', and ICU months 7–13 map to iCalendar months 6–12.

interoperability-note §7

When an iTIP message with an unsupported RSCALE calendar system is received, the receiving agent SHOULD reject it and return REQUEST-STATUS 3.1. If the message is accepted and treated as non-recurring, REQUEST-STATUS 2.8 or 2.10 SHOULD be returned.

normative-requirement §10 MUST NOT

CalDAV clients MUST NOT attempt to store iCalendar data containing RSCALE elements if the CALDAV:supported-rscale-set WebDAV property is not advertised by the server.

normative-requirement §5 SHOULD

Calendar agents SHOULD take into account CLDR 'deprecated' calendar system values and use the alternative 'preferred' calendar system instead. In particular, 'islamicc' is deprecated in favor of 'islamic-civil'.

normative-requirement §9 MUST

In jCal, if the BYMONTH element value is an integer, a numeric JSON value MUST be used. If the BYMONTH value includes the 'L' suffix (leap month), a JSON string value MUST be used.

json

normative-requirement §4 MUST NOT

SKIP MUST NOT be present in an RRULE unless the RSCALE element is also present.

normative-requirement §4.1 MUST

SKIP processing for invalid months occurs after BYMONTH in the RRULE element processing order, and SKIP processing for invalid days occurs after BYMONTHDAY, following the ordering defined in RFC 5545 Section 3.3.10.

normative-requirement §10.1 MUST

The CALDAV:supported-rscale-set property MUST be protected and SHOULD NOT be returned by a PROPFIND allprop request.

normative-requirement §10 SHOULD

The server SHOULD return an HTTP 403 response with a DAV:error element containing a CALDAV:supported-rscale XML element if a client attempts to store calendar data with an RSCALE value not supported by the server.

normative-requirement §6 MUST

When a calendar user agent rejects a component containing an unrecognized RSCALE, any overridden components (other components with the same UID) MUST also be rejected to avoid orphaned instances.

normative-requirement §4.1 SHOULD

When SKIP=BACKWARD is set, a date with an invalid month is changed to the previous valid month, and a date with an invalid day-of-month is changed to the previous valid day-of-month. If changing the month results in an invalid day-of-month, the skip behavior is reapplied.

normative-requirement §4.1 SHOULD

When SKIP=FORWARD is set, a date with an invalid month is changed to the next valid month and an invalid day-of-month to the next valid day. If adjusting the month produces an invalid day, skip behavior is reapplied per day-of-month rules.

protocol-element §10

A CalDAV server that supports RSCALE MUST advertise the CALDAV:supported-rscale-set WebDAV property on calendar home or calendar collections, optionally enumerating supported calendar systems as CALDAV:supported-rscale child elements.

protocol-element §4.2

Leap months are identified by appending the suffix 'L' to the regular month number. For example, '5L' denotes a leap month following the 5th regular month of the year. This notation is used in BYMONTH element values within RRULE.

protocol-element §10.1

The CALDAV:supported-rscale-set XML element (namespace urn:ietf:params:xml:ns:caldav) contains zero or more CALDAV:supported-rscale child elements whose PCDATA content names a supported calendar system. Values are case insensitive but uppercase is preferred.

protocol-element §4

The RRULE property is extended with a new RSCALE element specifying the calendar system for generating the recurrence pattern. All DATE, DATE-TIME, and PERIOD values continue to use the Gregorian format; only the recurrence expansion logic uses the non-Gregorian system.

routing, registry

protocol-element §4.1

The SKIP element controls handling of invalid dates generated during recurrence expansion: OMIT (default) ignores the invalid date, BACKWARD shifts to the previous valid date, and FORWARD shifts to the next valid date. SKIP MUST NOT be present unless RSCALE is also present.

security-consideration §11

This specification does not introduce any additional security concerns beyond those described in RFC 5545 (iCalendar), RFC 5546 (iTIP), and RFC 4791 (CalDAV).

security

wire-format §9

In jCal (JSON), a new 'rscale' string member and 'skip' string member are added to the 'recur' JSON object. For 'bymonth', integer values use a JSON number and values with the 'L' suffix MUST use a JSON string.

json

wire-format §8

In xCal (XML), a new <rscale> child element of <recur> carries the RSCALE value as a string with case preserved, and a new <skip> child element carries OMIT, BACKWARD, or FORWARD. The <bymonth> element is redefined to accept either a numeric or string value to support the 'L' leap-month suffix.

json

wire-format §4

RSCALE is added to recur-rule-part as 'RSCALE=' followed by an iana-token or x-name identifying a CLDR-registered calendar system name. The SKIP element takes values OMIT, BACKWARD, or FORWARD. Month numbers are extended with an optional 'L' suffix to indicate a leap month.