我正在使用rrule在数据库中创建和存储事件。
所有人都在工作,直到我发现我的重复活动与3月31日相差一小时。
在法国,这是我们更改夏令时的日子。
实际上,我的事件存储在mongo数据库中,包括事件的开始日期和持续时间,以及最终事件规则(所有事件不是重复发生的事件),如下所示:
{
"_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 }
规则返回:
recurringDays [ 2019-03-31T23:00:00.000Z, 2019-04-06T23:00:00.000Z ]
在我期待的时候:
recurringDays [ 2019-04-06T22:00:00.000Z ]
你知道我该怎么办吗?
答案 0 :(得分:1)
如果您希望重复规则遵守特定时区的夏令时,则必须使用该时区进行时间表。在您的示例中,时间表基于UTC。
RRule提供time zone support。您应该使用它,并指定tzid: 'Europe/Paris'
。
此外,您可能会考虑使用toString
和fromString
函数来处理iCalendar格式的字符串,并将其存储在MongoDB实例中,而不是将RRule序列化为JSON。