iCalendar: ЕЖЕМЕСЯЧНЫЙ РУБЛЬ без БЫТОВОГО ДНЯ или БЫВНОГО ДНЯ - PullRequest
0 голосов
/ 01 февраля 2019

Как интерпретировать правило ежемесячного повторения только с DTSTART (без BYDAY или BYMONTHDAY)?

Согласно RFC5545 вы можете определить правило повторения только с частотой, например,

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

Смартфон с LineageOG (Android Calendar), по-видимому, интерпретирует это как BYMONTHDAY и показывает событие только при наличии 31 числа месяца.IPhone явно интерпретирует это как последний день месяца и показывает событие каждый месяц (31-го, 30-го или даже 28-го).Какая интерпретация верна?

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

iPhone определенно не прав здесь. RFC 5545, раздел 3.3.10 четко гласит:

Информация, не содержащаяся в правиле, необходимая для определения времени и даты начала различных экземпляров повторения, выводится из времени начала("DTSTART") атрибут компонента.Например, «FREQ = YEARLY; ​​BYMONTH = 1» не указывает конкретный день в месяце или времени.Эта информация будет такой же, как указано для «DTSTART».

и

Правила повторения могут генерировать экземпляры повторения с недопустимой датой (например, 30 февраля)или несуществующее местное время (например, 1:30 утра в день, когда местное время сдвигается вперед на час в 1:00 утра).Такие экземпляры повторения ДОЛЖНЫ игнорироваться и НЕ ДОЛЖНЫ учитываться как часть набора повторений.

Эти два значения вместе взятые означают, что ваше событие повторяется каждый 31-й, но только в те месяцы, которые фактически имеют 31 день, в противном случаеэкземпляр игнорируется.

В любом случае, действительно лучше четко указать намерение и всегда предоставлять BYMONTHDAY в таком случае.

0 голосов
/ 02 февраля 2019

Возможно, iPhone «не прав», хотя rfc5545 явно не решает эту проблему https://icalendar.org/iCalendar-RFC-5545/3-8-5-3-recurrence-rule.html

Возможно, они взяли «что ожидает не технический пользователь?»Подход?

Мышление Apple, не так, не помогает.Было бы лучше сгенерировать RRULE, который явно понятен.Используйте BYMONTHDAY, если хотите только 31-го числа, или используйте BYDAY = -1 для последнего дня месяца

...