Rrule: 应该使用 DTSTART 作为第一次出现

创建于 2015-01-25  ·  10评论  ·  资料来源: jakubroztocil/rrule

根据 iCalendar 规范:

 The "DTSTART" property defines the first instance in the recurrence set.

它包括一个这样的例子:

 Every other week on Monday, Wednesday and Friday until December 24,
 1997, but starting on Tuesday, September 2, 1997:

 DTSTART;TZID=US-Eastern:19970902T090000
 RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;
  BYDAY=MO,WE,FR
 ==> (1997 9:00 AM EDT)September 2,3,5,15,17,19,29;October
 1,3,13,15,17
     (1997 9:00 AM EST)October 27,29,31;November 10,12,14,24,26,28;
                       December 8,10,12,22

rrule.js 不包括 9 月 2 日。 在 rrule.js 中,第一次出现是 9 月 3 日。

最有用的评论

我同意,默认情况下dtstart应该包含在内,以便与其他系统更加一致。

我制作了一个代码笔,展示了当前行为的微妙之处: https ://codepen.io/arshaw/pen/qwEQNO?editors=0010

所有10条评论

加1。 RRule 根本不遵守演示应用程序上的开始日期/持续时间

同意,这在处理 Google RFC 2445 java lib 时让我失望了。

:+1:这就是标准(以及 Google 日历、Apple (Mac OS/iOS/iCloud) 日历等兼容系统)的工作方式。

@jkbrzt ,现在,rrule.js 与 python dateutil 的功能相关联

与 RFC 中记录的不同,起始日期时间 (dtstart) 不是第一个重复实例,除非它符合指定的规则。
–– dateutil 文档

这似乎与 dateutil 有很大的不同,在这种情况下这似乎是有道理的。 这将涉及更改几乎所有的测试用例。 想法? 你会支持这种改变吗?

@hwangmoretime我已将您的更改合并到自述文件中,rrule.js 与 RFC 不同,谢谢。 是的,让rrule.js合规是很有意义的(这个问题 + byday关键字参数)。 但它会破坏向后兼容性,因此需要对其进行详细记录。

我相信这仍然有一个错误。 这适用于all()但不适用于方法between 。 在下面的示例中,我根据自述文件在RRuleSet对象上设置了dtstartrdate

screen shot 2016-03-19 at 1 41 49 pm

规则集
RRuleSet {_cache: Object, _rrule: Array[1], _rdate: Array[1], _exrule: Array[0], _exdate: Array[0]}

rruleSet.valueOf()
["RRULE:FREQ=YEARLY;DTSTART=20120122T000000Z;INTERVAL=1;WKST=0;BYMONTH=3;BYMONTHDAY=19;BYHOUR=13;BYMINUTE=39;BYSECOND=27", "RDATE:20120122T000000Z"]

rruleSet.all()[0]
Sat Jan 21 2012 16:00:00 GMT-0800 (PST)

rruleSet.between(startDatetime, endDatetime)
[Sat Mar 19 2016 13:39:27 GMT-0700 (PDT)]

请注意,对于方法all的调用,返回的日期与原始dtstart匹配,但对于between ,它默认返回当前时间

这里有更多的上下文。 据我所知,rruleset 的行为与我的预期完全相反。 它生成一个日期列表,其中第零个元素是原始所需事件的开始。 但这是扩展为一系列日期的当前时间。 我希望在 1 月 21 日获得日期列表,但是使用当前时间(3 月 22 日)“重复”了 rruleset。

screen shot 2016-03-22 at 6 02 21 pm

我已经撤回了 repo,并试图通过一些测试缩小范围,但任何建议都值得赞赏。

我对 dtstart 有类似的问题。 见https://stackoverflow.com/questions/54517101/rrule-not-setting-correct-time-if-dtstart-is-set
当我在构造函数中设置 dtstart 时,我使用 .all() 获得正确的时间,但是如果我之后设置 dtstart,我将获得当前时间。

我同意,默认情况下dtstart应该包含在内,以便与其他系统更加一致。

我制作了一个代码笔,展示了当前行为的微妙之处: https ://codepen.io/arshaw/pen/qwEQNO?editors=0010

默认情况下, dtstart应该包含在内,以便与其他系统更加一致。

同意。 立即了解规则。 这是一个很好的节省时间(谢谢!),但这个包含日期问题的奇怪细微差别需要一些自定义逻辑来解决。 很想看到这个更新。 理解与 python-dateutil 一致的当前行为,但我认为优先级应该放在与 RFC 标准一致的行为上,而不是使奇怪的偏差永久化。

另外,根据下面的评论:

请注意,您可以通过使用 RRuleSet 并将 dtstart 添加为 rdate 来获得原始行为。

据我所知,这大大低估了许多用例所需的解决方法的复杂性。

例如,假设您有以下规则参数:

new RRule({
  freq: RRule.WEEKLY,
  dtstart: new Date(Date.UTC(2020, 10, 1, 21, 0, 0)),
  count: 10,
  interval: 2,
  byweekday: RRule.MO
})

应该转化为“每 2 周在星期一进行 10 次”,开始日期为 2020 年 11 月 1 日星期日。

现在,开始日期之后的第一个日历星期一是 11 月 2 日……因此,间隔为 2,我们希望生成的事件日期为 11 月 2 日、11 月 16 日、11 月 30 日等。

然而, rrule包反而为我们提供了 11 月 9 日、11 月 23 日等的日期。换句话说,我们的整个时间间隔是错误的,向前移动了一周。 解决这个问题并不像“使用 RRuleSet 并将 dtstart 添加为 rdate”那么简单。 这种类型的修复还有很多工作要做。

image

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

espen picture espen  ·  11评论

Prinzhorn picture Prinzhorn  ·  15评论

spurreiter picture spurreiter  ·  3评论

jimmywarting picture jimmywarting  ·  9评论

shavenwalrus picture shavenwalrus  ·  7评论