0

如何解释仅使用 DTSTART(无 BYDAY 或 BYMONTHDAY)的每月重复规则?

根据 RFC5545,您可以定义仅具有频率的重复规则,例如

DTSTART;TZID=US-Eastern:20180831T090000
RRULE:FREQ=MONTHLY

带有 LineageOG(Android 日历)的智能手机显然将此解释为 BYMONTHDAY,并且仅在每月 31 日时才显示该事件。iPhone 显然将此解释为该月的最后一天,并在每个月(31 日、30 日甚至 28 日)显示该事件。哪种解释是正确的?

4

2 回答 2

2

可以说 iPhone 是“错误的”,尽管 rfc5545 没有明确解决这个问题https://icalendar.org/iCalendar-RFC-5545/3-8-5-3-recurrence-rule.html

也许他们已经采取了“非技术用户期望什么?” 方法?

认为苹果错了也无济于事。最好生成一个明确的 RRULE。如果只需要 31 日,请使用 BYMONTHDAY,或者使用 BYDAY=-1 表示月份的最后一天

于 2019-02-02T09:33:29.313 回答
1

iPhone在这里肯定是错的。RFC 5545,第 3.3.10 节明确指出:

确定各种重复实例开始时间和日期所需的不包含在规则中的信息是从开始时间(“DTSTART”)组件属性派生的。例如,“FREQ=YEARLY;BYMONTH=1”不指定月份或时间中的特定日期。此信息将与为“DTSTART”指定的信息相同。

重复规则可能会生成具有无效日期(例如,2 月 30 日)或不存在本地时间(例如,本地时间在凌晨 1:00 向前移动一小时的一天的凌晨 1:30)的重复实例。这样的重复实例必须被忽略,并且不能被算作重复集的一部分。

这两个加在一起意味着您的事件每 31 日重复一次,但仅在实际有 31 天的月份内重复,否则该实例将被忽略。

无论哪种方式,最好明确说明意图并BYMONTHDAY在这种情况下始终提供。

于 2019-04-05T14:39:48.177 回答