Интервал повторения ISO 8601

Википедия дает пример ISO 8601 примера интервал повторения:

R5/2008-03-01T13:00:00Z/P1Y2M10DT2H30M

Вот что это значит:

  • R5 означает, что интервал после косой черты повторяется 5 раз.
  • 2008-03-01T13:00:00Z означает, что интервал начинается в указанное время и дату.
  • P1Y2M10DT2H30M means that the interval lasts for
    • 1 year
    • 2 месяца
    • 10 дней
    • два часа
    • 30 минут

Моя проблема в том, что я не знаю точно, что здесь повторяется. Происходит ли повторение сразу после окончания интервала? Могу я указать, что каждый понедельник что-то происходит с 13:00 до 14:00?


person kzh    schedule 07.09.2011    source источник
comment
Для интервалов без конкретной даты начала или окончания я создал формат на основе ISO 8601. Он используется в этих JavaScript и PHP. каждый понедельник в 13:00:00 в вашем примере записывается как F1D/WT13H0M0S. 1-часовой интервал (длительность) можно сохранить независимо.   -  person smhg    schedule 25.08.2014
comment
@smhg У вас есть документ, в котором описаны ваши расширения? Если да, то очень хотелось бы прочитать, если нет, то давайте сделаем!   -  person kzh    schedule 26.08.2014
comment
Я читал RRULE RFC 5545 (из iCalendar), основанный на на ответ Му Минда. Мой формат зависит от функций внешнего фильтра для более сложных операций (например, F(нечетное)W/ET10H0M0S для каждого дня в 10:00:00 в нечетные недели). RRULE позволяет вам указать все встроенное, но это не читается людьми (без знания rfc). В моих случаях использования это компромисс, на который я готов пойти. Поэтому я перепишу обе библиотеки, используя этот существующий стандарт.   -  person smhg    schedule 26.08.2014


Ответы (2)


Сам стандарт ничего не разъясняет, но единственная очевидная интерпретация здесь состоит в том, что интервал повторяется подряд. Итак, этот повторяющийся интервал:

R2/2008-03-01T13:00:00Z/P1Y2M10DT2H30M

Будет эквивалентно этим неповторяющимся интервалам:

2008-03-01T13:00:00Z/P1Y2M10DT2H30M
2009-05-01T15:30:00Z/P1Y2M10DT2H30M

(Примечание: мое чтение состоит в том, что количество повторений действительно включает первое появление)

Невозможно представить «каждый понедельник с 13:00 до 14:00» внутри ISO 8601, но это естественно сделать для VEVENT в формате iCalendar. (Если бы вы могли сделать это полностью в рамках ISO 8601, это привело бы к множеству запросов на дополнительные функции)

person Mu Mind    schedule 17.09.2011
comment
И как бы вы интерпретировали R2/P1M/2008-03-01T13:00:00Z (длительность и дата окончания)? Как вы думаете, это то же самое, что и R2/2008-02-01T13:00:00Z/P1M? - person Melanie; 19.09.2014
comment
Неа. Это означало бы, что повторение заканчивается на этой дате, но продолжается до бесконечности в прошлое. - person Ole Tange; 05.06.2017
comment
Поскольку число [n] указано, я интерпретирую его как означающее, что оно не бесконечно возвращается назад во времени. - person Noel Yap; 28.02.2018

Да, ISO8601 определяет регулярный повторяющийся интервал (или настолько регулярный, насколько месяц может быть одной из единиц).

R5/2008-03-01T13:00:00Z/P1Y2M10DT2H30M

Должен генерировать это время:

2009-05-11T15:30:00Z
2010-07-21T18:00:00Z
2011-10-01T20:30:00Z
2012-12-11T23:00:00Z
2014-02-22T00:30:00Z

Он не определяет время начала и окончания, как это делает RFC5545 (iCalendar), и даже не определяет нерегулярное повторение, как RRULE или crontab.

Вы должны иметь возможность указать еженедельное повторение, используя дату недели ISO в качестве отправной точки, но вам потребуются отдельные повторения для времени начала и окончания:

R/2021-W01-1T13:00:00Z/P1W
R/2021-W01-1T14:00:00Z/P1W

Первый интервал предназначен для времени начала: понедельник в 13:00 (начиная с 2021 года), а второй — для времени окончания: понедельник в 14:00 (начиная с 2021 года).

person brianary    schedule 07.04.2021