如何仅使用DTSTART(没有BYDAY或BYMONTHDAY)来解释每月重复规则?
例如,根据RFC5545,您可以定义仅包含频率的重复规则
DTSTART;TZID=US-Eastern:20180831T090000
RRULE:FREQ=MONTHLY
配备LineageOG(Android日历)的智能手机显然将其解释为BYMONTHDAY,并且仅在每月31日时显示该事件。 iPhone显然将此解释为本月的最后一天,每个月(31日,30日甚至28日)显示该事件。哪种解释是正确的?
虽然rfc5545没有明确地解决https://icalendar.org/iCalendar-RFC-5545/3-8-5-3-recurrence-rule.html这个问题,但iPhone可能是“错误的”
也许他们采取了“非技术用户会期望什么?”的方法?
思考苹果错了没有帮助。生成一个明确清楚的RRULE会更好。如果只想要31,请使用BYMONTHDAY,或者在月份的最后一天使用BYDAY = -1
iPhone在这里肯定是错的。 RFC 5545, section 3.3.10明确指出:
确定各种重复实例开始时间和日期所必需的信息(未包含在规则中)是从“开始时间”(“DTSTART”)组件属性派生的。例如,“FREQ = YEARLY; BYMONTH = 1”未指定月份或时间内的特定日期。此信息与“DTSTART”指定的信息相同。
和
重复规则可以生成具有无效日期(例如,2月30日)或不存在的本地时间(例如,在当地时间在凌晨1:00向前移动一小时的那天的1:30 AM)的重现实例。必须忽略此类重复实例,并且不得将其视为递归集的一部分。
这两个一起表示您的事件每31个重复一次,但只有几个月实际有31天,否则实例将被忽略。
无论哪种方式,明确关于意图确实更好,并且总是在这种情况下提供BYMONTHDAY
。