如何解释只有DTSTART (没有BYDAY或BYMONTHDAY)的月度递归规则?
根据RFC5545,您可以定义仅具有频率的循环规则,例如
DTSTART;TZID=US-Eastern:20180831T090000
RRULE:FREQ=MONTHLY显然,安装了LineageOG (安卓日历)的智能手机会将这一事件解释为BYMONTHDAY,只有在一个月的31日才会显示这一事件。iPhone显然将其解释为每月的最后一天,并显示每个月(31号、30号甚至28号)的事件。哪种解释是正确的?
发布于 2019-02-02 17:33:29
可以说iPhone是“错误的”,尽管rfc5545没有明确地解决这个问题https://icalendar.org/iCalendar-RFC-5545/3-8-5-3-recurrence-rule.html
也许他们会问:“非技术用户会期望什么?”接近?
认为苹果错了也于事无补。最好是生成一个明确的RRULE。如果只需要第31天,则使用BYMONTHDAY,或者使用BYDAY=-1表示每月的最后一天
发布于 2019-04-05 22:39:48
iPhone在这里肯定是错的。RFC 5545, section 3.3.10清楚地指出:
确定各种重复实例开始时间和日期所需的
信息不包含在规则中,它是从开始时间("DTSTART")组件属性派生而来的。例如,"FREQ=YEARLY;BYMONTH=1“不指定月份或时间内的特定日期。此信息将与为"DTSTART“指定的信息相同。
和
重复规则可能会生成具有无效日期(例如,2月30日)或不存在本地时间(例如,本地时间在凌晨1:00提前一个小时的某一天的1:30 AM)的重复实例。必须忽略此类重复实例,并且不能将其计入重复集合的一部分。
这两个加在一起意味着你的事件在每31天重现一次,但只在实际有31天的月份重现,否则实例将被忽略。
无论哪种方式,明确说明意图并在这种情况下始终提供BYMONTHDAY都是更好的做法。
https://stackoverflow.com/questions/54484240
复制相似问题