问题标签 [rrule]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
578 浏览

rrule - RRule 能否描述每天在两个特定时间发生的事件?

假设我有一个事件发生在每天晚上 7:00 和下午 2:00。RRule 看起来像这样:

如果我想要在上午 10:00 和下午 2:30 发生的事件我会假设它看起来像这样:

但这似乎并不正确。规范中说“BYxxx 规则部分在一段时间内低于频率通常会增加或扩大重复出现的次数”。在http://jkbrzt.github.io/rrule/进行测试会产生以下结果:

  • 周一 10:00
  • 周一 10:30
  • 周一 14:00
  • 周一 14:30
  • 周二 10:00
  • 周二 10:30
  • 周二 14:00
  • 周二 14:30

我真正想要的是:

  • 周一 10:00
  • 周一 14:30
  • 周二 10:00
  • 周二 10:30
  • 周三 10:00
  • 周三 14:30
  • 周四 10:00
  • 星期四 14:30
0 投票
2 回答
1058 浏览

javascript - rruleJS:考虑每周案例的时区

我正在使用 rruleJS ( https://github.com/jkbrzt/rrule ) 并且开始日期如下:

开始日期和时间:2015-09-15 23:45 每第三周 工作日:周一、周三、周日

我保存它并得到这个规则:

我现在预计我的复发开始时间是 23:45,

但相反,我得到了这些重复:

这是因为转换为当地时间(CEST-> +2 小时 -> 23:45 变为 01:45)。我可以减去时区偏移,但这会切换到另一个工作日。例如,如果我从 2015 年 9 月 16 日星期三 01:45:00 GMT+0200 (CEST) 减去 2 小时,我将得到 2015 年 9 月 15 日星期二 23:45:00 GMT+0200 (CEST)。

但这不是我想要的:时间是正确的,但不是工作日。我不希望它在周二重演,而是在周一、周三或周日重演。

如何考虑时区但仍保留开始的工作日?

0 投票
1 回答
484 浏览

icalendar - 谷歌日历中的 iCal;规则:每隔一个工作日

我的妻子(老师)每隔一个工作日教一次。是否可以制定涵盖该问题的重复规则?我试过了:

...但这没有用。它只是每天,每隔一周。

0 投票
1 回答
739 浏览

rfc5545 - RRULE (rfc 5545) 直到计数

我无法理解关于and的rfc5545。据我了解,根据 RFC 的这一部分,UNTIL 和 COUNT 不能在同一个重复规则中:untilcount

值名称:RECUR

用途:此值类型用于标识包含重复规则规范的属性。

正式定义:值类型由以下
符号定义:

在 rfc 中进一步说明:

如果指定了多个 BYxxx 规则部分,则在评估指定的 FREQ 和 INTERVAL 规则部分之后,BYxxx 规则部分将按以下顺序应用于当前评估的事件集:BYMONTH、BYWEEKNO、BYYEARDAY、BYMONTHDAY、BYDAY、BYHOUR、BYMINUTE , BYSECOND 和 BYSETPOS; 然后评估 COUNT 和 UNTIL。

最后一段似乎暗示 COUNT 和 UNTIL 可以在同一个 RRULE 中。

当我检查实现 rrule 生成器和解析的库时,没有验证可以确保 COUNT 和 UNTIL 不在同一个递归中。

每个人通常对此进行的一般实施是什么?我们是否应该忽略此验证并在同时存在 COUNT 和 UNTIL 时简单地使用 UNTIL 参数(反之亦然)?RFC 对 COUNT 和 UNTIL 参数的确切含义是什么?

0 投票
1 回答
106 浏览

icalendar - 两种不同长度的 iCal rrule

我想在我的日历中输入一个事件,该事件在每周一和周二的 8 点至 3 点和周六的 8 点至 12 点运行。我的应用程序支持规则。是否可以将其打包成一个规则?

如果只是工作日,那么规则会很简单,看起来像:

任何提示表示赞赏。

0 投票
1 回答
598 浏览

android - 在日历中添加重复事件时出错

您好我正在尝试创建一个将事件添加到日历的应用程序。例如,我需要在每个星期六创建一个事件,直到 12 月 31 日。以下是我为创建事件设置的属性,

但它会为给定日期 (sDate) 创建一个事件,然后在每个星期六创建。但是我怎样才能避免在给定日期(sDate)创建的一个事件

0 投票
2 回答
1852 浏览

node.js - 如何在运行 node.js 的服务器上使用时刻 js 和时区偏移将日期从 rrule 字符串转换为 UTC 格式?

在浏览器上,我制作了一个生成 rrule 字符串的小部件:

我还使用此功能从浏览器获取时区偏移量:

我将它们发送到运行 node.js 的服务器。在服务器上,我想使用 rrule 和时区偏移来生成 UTC 格式的日期列表。这是我现在的做法:

似乎我应该能够使用不起作用的函数来获取 UTC 日期,但由于某种原因它们不起作用。我想我错过了一些关于如何使用正确的方式来做到这一点的事情。谁能看到我做错了什么?

0 投票
1 回答
903 浏览

standards - iCalendar UNTIL 规则必须与 DTSTART 属性的类型相同?

iCalendar RFC 5545, section 3.3.10中,我看到以下 UNTIL 参数描述:

UNTIL 规则部分的值必须与“DTSTART”属性具有相同的值类型。此外,如果“DTSTART”属性被指定为带有本地时间的日期,那么 UNTIL 规则部分也必须被指定为带有本地时间的日期。如果“DTSTART”属性指定为带有 UTC 时间的日期或带有本地时间和时区参考的日期,则 UNTIL 规则部分必须指定为带有 UTC 时间的日期。

但是,在3.8.5.3 Recurrence Rule段落中,UNTIL 始终以 UTC 指定,与 DTSTART 属性无关:

总共有5个这样的例子。

我还发现,无论 DTSTART 属性如何,至少有 2 个 CalDAV 客户端(iOS 和 Mozilla Lightning)总是以 UTC 格式提交 UNTIL 参数。

UNTIL 必须始终使用 UTC 的唯一位置是 VTIMEZONE 中的 RRULE。还是我没有得到什么?

0 投票
1 回答
744 浏览

icalendar - 如果 DTSTART 的日期不在 BYDAY 指定的日期中,我如何从生成的事件中排除它?

我正在使用google-rfc-2445根据 rfc-2445 生成重复事件

“VEVENT”的“DTSTART”属性指定事件的包含开始。对于重复事件,它还指定重复集中的第一个实例。

因此,例如每周五发生 5 次的事件的 RRULE:

所以根据rfc-2445它将产生 6 个事件。第一个事件 on Thursday 4 February 2016,第二个事件 on Friday 5 February 2016,依此类推。

如果它不在模式中,我如何实现它将排除第一个事件?在上面的示例中,它应该排除第一次出现的4 February 2016. 如果定义DTSTART;TZID=US-Eastern:20160205T090000哪个是星期五,则应保留第一次出现。

是否可以通过自行定义此类“排除规则”来完成,RRULE或者我需要在代码中进行检查,如果DTSTART与中定义的日期不同,BYDAY我应该(手动)在代码中查找最接近的日期并DTSTART相应地进行更改?

更新 好的,根据 rfc-2445 和谷歌组上的这个问题:https ://groups.google.com/forum/#!topic/google-rfc-2445/xqYFe411ysA

“EXDATE”属性可用于排除
“DTSTART”中指定的值。然而,在这种情况下,原始“DTSTART”日期
仍必须由日历和调度系统维护,因为
原始“DTSTART”值与其他属性(例如“RECURRENCE-ID”)具有内在的使用依赖性。

看起来我需要使用EXDATE属性来实现我需要的东西。尝试通过遵循 RRULE 来实现这一点:

开始日期是:2016-02-10T00:00:00.000+02:00在以下代码中:

但它只返回 4 个事件,所以它总是删除第一个事件。

0 投票
1 回答
684 浏览

cron - 重复事件,如何存储?

我发现了一些关于经常性事件的问题,但我还没有进入一个接近我需要的问题。我正在努力了解如何处理通知系统的重复事件。

到目前为止,我知道两种选择:

  1. 存储具有模式的单个事件并动态计算任何未来事件(例如永远重复等)。使用 cron 模式甚至更好的 RRULE 东西。

  2. 将所有未来事件存储为单个事件,直到某个日期。

我对选项 1 的问题是我需要我的事件来保存一些其他数据,例如确认,如果我有重复事件,我可能需要为每个重复事件保存多个确认。这变成了一个令人讨厌的黑客来使事情正常进行,我什至不想考虑如何处理显示与其他数据相关联的过去和未来事件。

选项 2 更好,因为即使在单个事件中我也可以存储与每个相关的所有额外数据。问题在于处理未来事件。首先,如果事件永远重复,那么我应该存储多少事件。如果用户想要显示尚未生成的未来事件,我是否只是做块并即时生成?这个选项也感觉像一个黑客。

到目前为止,我已经阅读了一些关于 RRULE 的内容,发现我可以将 rrule.js 用于前端,将其他一些包用于后端。

编辑 1:为了更好地澄清,我没有完全准备好使用完整的 iCal 格式标准,我想只使用 RRules。但是,我可能会改变主意,因为我仍在寻找选择。

iCal Vevents 和 rrules 应该如何存储在数据库中?