Беда с RF C 5545 Повторение по дням - PullRequest
0 голосов
/ 12 марта 2020

Я вижу ошибочное поведение с шаблоном повторения по дням (например, каждый вторник и четверг).

Предположим, у меня есть событие, начинающееся в 3/12 четверга в 9:00 (21:00) Pacifi c время и повторяется каждый вторник и четверг. Pacifi c время равно UTC-0700, поэтому дата начала мероприятия UT C - 04:00 в 3/13 - 4:00 следующего дня.

Когда генерируются мои повторения, они принимают время исходного события, но не дату. Таким образом, мои повторения генерируются по вторникам и четвергам в 04:00, что соответствует 9p PT по понедельникам и средам.

Я попытался создать события по местному (Pacifi c) времени и указать TZ-ID , но это, похоже, не помогает.

Есть ли способ объяснить это? Я не хочу пытаться определить, будет ли проблема, и переписать шаблон повторения на лету, поскольку A) кажется очень подверженным ошибкам, а B) сделает интерфейс для редактирования шаблона повторения очень сложным.

РЕДАКТИРОВАТЬ:

Рассмотрим этот RRULE:

DTSTART:20200411T013000Z
RRULE:FREQ=WEEKLY;UNTIL=20200501T030000Z;BYDAY=FR

Он был создан, чтобы начинаться в 6:30 по тихоокеанскому времени в пятницу, 10 апреля и повторяться каждую пятницу.

При преобразовании в UT C это означает, что его дата начала 1: 30a 11 апреля.

Проблема в том, что BY_DAY=FR заставляет создавать все дочерние события по пятницам с временем начала 1: 30а, что означает, что они начинаются в четверг вечером по горному времени.

Я не думаю, что это проблема кода, я думаю, что это проблема правила повторения BY_DAY, вызывающего проблемы, когда время запуска начинается после полуночи UT C.

Кроме того, обратите внимание, что это пример. Очевидно, что в этом случае поле BY_DAY не обязательно. Но если бы я хотел, чтобы это повторялось по средам и пятницам, мне это нужно, и вот тут я сталкиваюсь с проблемой.

1 Ответ

1 голос
/ 13 апреля 2020

В вашем вопросе не так много информации, но позвольте мне попытаться помочь вам. Вы говорите о формате iCal и, вероятно, используете Django для генерации событий iCal. Рекомендуется хранить все ваши данные, связанные с датой и временем, в формате UT C в вашей базе данных Django, см. https://docs.djangoproject.com/en/3.0/topics/i18n/timezones/#overview. Вы можете использовать стандартные функции утилит, которые Django предоставляет для вычисления времени и даты в других часовых поясах, см. https://docs.djangoproject.com/en/3.0/ref/utils/#module - django .utils.timezone . Поэтому правильное время в вашей Django программе не должно быть проблемой.

Насколько я понимаю, iCal может определять события как в UT C, так и в других часовых поясах. Таким образом, еженедельное событие с датой начала 13 марта 2020 года и временем начала 04:00 должно содержать следующие записи:

DTSTART:20200313T040000Z
RRULE:FREQ=WEEKLY

См. https://icalendar.org/iCalendar-RFC-5545/4-icalendar-object-examples.html для дополнительных примеров. Надеюсь, это поможет вам в правильном направлении.

...