Правило iCalendar UNTIL должно быть того же типа, что и свойство DTSTART?

В iCalendar RFC 5545, раздел 3.3.10 я вижу следующее ДО ТОГО описание параметра:

Значение части правила UNTIL ДОЛЖНО иметь тот же тип значения, что и свойство «DTSTART». Более того, если свойство «DTSTART» указано как дата с местным временем, то часть правила UNTIL также ДОЛЖНА быть указана как дата с местным временем. Если свойство «DTSTART» указано как дата со временем в формате UTC или дата со ссылкой на местное время и часовой пояс, то часть правила UNTIL ДОЛЖНА быть указана как дата с временем в формате UTC.

Однако в параграфе 3.8.5.3 Правило повторения UNTIL всегда указывается в UTC, независимо от свойства DTSTART:

   DTSTART;TZID=America/New_York:19970902T090000
   RRULE:FREQ=DAILY;UNTIL=19971224T000000Z

   DTSTART;TZID=America/New_York:19970902T090000
   RRULE:FREQ=WEEKLY;UNTIL=19971007T000000Z;WKST=SU;BYDAY=TU,TH

Всего таких примеров 5.

Я также обнаружил, что по крайней мере 2 клиента CalDAV (iOS и Mozilla Lightning) всегда отправляют параметр UNTIL в формате UTC, независимо от свойства DTSTART.

Единственное место, где UNTIL всегда должен быть в формате UTC, - это RRULE в VTIMEZONE. Или я чего-то не понимаю?


person IT Hit WebDAV    schedule 21.01.2016    source источник


Ответы (1)


Процитированный абзац состоит из трех частей:

часть 1

Значение части правила UNTIL ДОЛЖНО иметь тот же тип значения, что и свойство «DTSTART».

Это относится к типу значения, то есть VALUE=DATE vs. VALUE=DATE-TIME. Если это событие на весь день, дата UNTIL также должна быть указана как дата на целый день, в противном случае дата UNTIL должна иметь компонент времени.

часть 2

Более того, если свойство «DTSTART» указано как дата с местным временем, то часть правила UNTIL также ДОЛЖНА быть указана как дата с местным временем.

В этом контексте «местное время» означает «плавающее время», как указано в разделе 3.3.5. (Форма №1), в которой говорится:

ФОРМА №1: ДАТА ПО МЕСТНОМУ ВРЕМЕНИ

Дата с местным временем - это просто значение DATE-TIME, которое не содержит указателя UTC и не указывает часовой пояс. Например, следующее представляет 18 января 1998 г., 23:00:

19980118T230000

Значения ДАТА-ВРЕМЯ этого типа называются «плавающими» и не привязаны к какому-либо конкретному часовому поясу.

Это также включает VALUE=DATE дат.

Если DTSTART является плавающим, то есть не привязанным к какому-либо конкретному часовому поясу, значение UNTIL не может быть абсолютным временем, в противном случае фактическое окончание правила будет зависеть от вашего текущего часового пояса.

Как уже отмечалось, это не относится к RRULE внутри определений VTIMEZONE.

часть 3

Если свойство «DTSTART» указано как дата со временем в формате UTC или дата со ссылкой на местное время и часовой пояс, то часть правила UNTIL ДОЛЖНА быть указана как дата с временем в формате UTC.

Ключевое отличие состоит в том, что в этом предложении говорится об абсолютном DTSTART времени в формате UTC или по местному времени со ссылкой на часовой пояс (как в приведенных примерах).

Это относится к Форме № 2 и Форме № 3 Раздела 3.3.5 . Если значение DTSTART соответствует любой из этих форм, значение UNTIL должно быть указано во времени UTC. Я думаю, что причина этого в том, что вам не нужно указывать часовой пояс для UNTIL даты, если вы используете нотацию «zulu» (и вы не можете предположить, что вы можете использовать часовой пояс DTSTART для UNTIL).

изменить

Поскольку "плавающее время" не очень распространено в клиентах календаря, вы почти не увидите даты, отличные от UTC UNTIL. В Thunderbird / Lightning вы можете явно выбрать «Местное время» для события, которое создает плавающее событие. В этом случае вы также должны получить значение UNTIL по местному времени.

person Marten    schedule 21.01.2016
comment
Вы правы, я пропустил дату с указанием местного времени и часового пояса. - person IT Hit WebDAV; 21.01.2016
comment
Насколько я понимаю, не-UTC UNTIL типично для дневных мероприятий. Однако Lightning (в отличие от iOS и eM Client) генерирует время в формате UTC для дневных событий, что выглядит как ошибка: DTSTART; VALUE = DATE: 20160229 RRULE: FREQ = DAILY; UNTIL = 20160304T000000Z - person IT Hit WebDAV; 21.01.2016
comment
Ага, похоже на ошибку. - person Marten; 21.01.2016