iCalendar:没有BYDAY或BYMONTHDAY的每月RRULE

问题描述 投票:0回答:2

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

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

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

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

icalendar rfc5545 rfc2445
2个回答
2
投票

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

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

思考苹果错了没有帮助。生成一个明确清楚的RRULE会更好。如果只想要31,请使用BYMONTHDAY,或者在月份的最后一天使用BYDAY = -1


1
投票

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

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

重复规则可以生成具有无效日期(例如,2月30日)或不存在的本地时间(例如,在当地时间在凌晨1:00向前移动一小时的那天的1:30 AM)的重现实例。必须忽略此类重复实例,并且不得将其视为递归集的一部分。

这两个一起表示您的事件每31个重复一次,但只有几个月实际有31天,否则实例将被忽略。

无论哪种方式,明确关于意图确实更好,并且总是在这种情况下提供BYMONTHDAY

© www.soinside.com 2019 - 2024. All rights reserved.