Правила и дневные сбережения - PullRequest
1 голос
/ 17 марта 2019

Я использую rrule для создания и хранения событий в моей базе данных.

Все работало, пока я не обнаружил, что мои повторяющиеся события имели разницу в один час после 31 марта.

Во Франции это день перехода на летнее время.

На самом деле, мои события хранятся в базе данных Монго, с датой начала и продолжительностью события, + правила события (все события не являются повторяющимися событиями), например:

{
    "_id" : ObjectId("5c8e4706703df43859aabbe7"),
    "duration" : 2879,
    "type" : "unavailability",
    "title" : "Weekend",
    "description" : "C'est le weekend",
    "rrules" : [ 
        {
            "until" : ISODate("2021-03-22T23:00:00.000Z"),
            "dtstart" : ISODate("2019-03-11T23:00:00.000Z"),
            "byweekday" : [ 
                {
                    "weekday" : 5
                }, 
                {
                    "weekday" : 6
                }
            ],
            "interval" : 1,
            "freq" : 2
        }
    ],
    "__v" : 0
}

Когда пользователь ищет в календаре дату, он будет искать с такими аргументами:

?from=2019-03-10T23:00:00.000Z&to=2019-03-17T23:00:00.000Z

Это хорошо работает с этой датой, потому что между ними нет перехода на летнее время. Если у меня есть этот объект:

normalizedDates = { from: 2019-03-10T23:00:00.000Z, to: 2019-03-17T23:00:00.000Z }

и это правило:

{ until: 2021-03-22T23:00:00.000Z,
  dtstart: 2019-03-11T23:00:00.000Z,
  byweekday: [ { weekday: 5 }, { weekday: 6 } ],
  interval: 1,
  freq: 2 }

Бег:

const recurringDays = rruleSet.between(normalizedDates.from, normalizedDates.to)

показывает, действительно:

recurringDays [ 2019-03-23T23:00:00.000Z ]

Но если вы используете:

normalizedDates = { from: 2019-03-31T22:00:00.000Z, to: 2019-04-07T22:00:00.000Z }

Rrules возвращает:

recurringDays [ 2019-03-31T23:00:00.000Z, 2019-04-06T23:00:00.000Z ]

пока я ожидаю:

recurringDays [ 2019-04-06T22:00:00.000Z ]

Вы знаете, как я мог справиться с этим?

1 Ответ

1 голос
/ 18 марта 2019

Если вы хотите, чтобы правило повторения наблюдало переход на летнее время для определенного часового пояса, то вы должны запланировать использование этого часового пояса. В вашем примере расписание основано на UTC.

RRule обеспечивает поддержку часового пояса . Вы должны использовать это и указать tzid: 'Europe/Paris'.

Кроме того, вы можете рассмотреть возможность использования функций toString и fromString для работы со строками, отформатированными в iCalendar, и сохранить их в своем экземпляре MongoDB вместо сериализации RRule как JSON.

...