【问题标题】:Is EXDATE not included in rrule for Full CalendarEXDATE 是否不包含在完整日历的规则中
【发布时间】:2019-10-28 01:24:26
【问题描述】:

我有一个在每个月的第四个星期五发生的周期性日历事件,我想排除 1 个星期五的事件。我已经尝试过EXDATE,但出现错误

传递 JSON 失败

没有EXDATE rrule 可以正常工作。

这是我在完整日历中用来制作活动的详细信息

{
    start: "2019-07-06T09:00:00+10:00",
    end: "2019-07-06T15:00:00+10:00",
    rrule: "FREQ=WEEKLY;DTSTART=20190607T090000;EXDATE=20190705T090000;INTERVAL=4;BYDAY=FR",
    title: "Weed Spraying",
    description: "June, Harry, Pat, George, Valda, Helen, Karen, Ken",
    color: "red",
    url: "./?action=detail_view&id=22",
    duration: "06:00"
}

【问题讨论】:

    标签: fullcalendar rrule fullcalendar-4


    【解决方案1】:

    不太了解这种特殊的 JSON 格式,但 EXDATE 是一个属性,而不是 RRULE 的参数。 请尝试

    rrule: "FREQ=WEEKLY;DTSTART=20190607T090000;INTERVAL=4;BYDAY=FR\nEXDATE=20190705T090000"
    

    【讨论】:

    • 我看不出这比 OP 的代码有什么好处,或者它为什么有效。我非常怀疑 RRULE 格式是否有换行符 (\n) 作为可接受的分隔符。您所做的只是将; 替换为\n,我怀疑它是否有效。我不太了解格式,但它看起来没有意义。你能准确解释一下 RRULE 中“属性”和“参数”之间的区别吗?
    • 好吧,它看起来更像是一个 rrule.js 问题,而不是一个完整的日历问题。正在使用的 rrule 插件会引发错误 Unknown RRULE property 'EXDATE'。如果您尝试输入 FREQ=WEEKLY;DTSTART=20190607T090000;EXDATE=20190705T090000;INTERVAL=4;BYDAY=FR 作为文本字符串,它也会在 rrule 演示页面 jakubroztocil.github.io/rrule 上执行此操作,您会收到相同的错误。
    • @ADyson RRULE 和 EXDATE 都被 RFC5545 定义为属性。请参阅 tools.ietf.org/html/rfc5545#section-3.8.5.3tools.ietf.org/html/rfc5545#section-3.8.5.1 了解它们各自的定义以及 tools.ietf.org/html/rfc5545#section-3.2 以帮助您了解这一切。在原始帖子中,EXDATE 是 RRULE 的参数,而不是其自身的属性。然后如果你看fullcalendar.io/docs/rrule-plugin你会看到可以在rrule中指定多个属性,用\n分隔
    • 不幸的是,看起来只能在 rrule 中指定 DTSTART 属性,而不能指定与循环相关的属性(EXDATE 或 RDATE)。
    • 查看github.com/jakubroztocil/rrule 上的文档,我假设我必须使用 RRuleSet 构造函数,即。 RRuleSet.prototype.exdate(dt) 来设置每个 EXDATE,但我不知道在 fullCalendar 代码中的哪个位置
    【解决方案2】:

    可以添加例外。您只需要正确格式化 RRule 字符串:

    DTSTART:20190610T103000\nRRULE:FREQ=DAILY;INTERVAL=1;UNTIL=20190801\nEXDATE:20190618T103000Z\nEXDATE:20190619T103000
    

    观看此code sandbox 进行演示

    【讨论】:

    • 完整日历也接受对象而不是字符串。您能否提供一个示例,说明我们如何以具有多个日期的形式实现它?
    • 当心,fullcalendar/rrule 连接器中当前存在一个错误,如果您以 UTC 格式(尾随 Z)提供日期,则会导致多个 EXDATE 无法正常工作。见github.com/fullcalendar/fullcalendar/issues/5726
    【解决方案3】:

    好的,我解决了,@Arnaud 是对的,RRULE、EXDATE 和 DTSTART 是属性而不是 rrule 的参数,但是它们确实在 FullCalendar 的 rrule 属性中带有 \n 换行符,它们还需要:NOT =。示例

    rrule: 'DTSTART:20190308T120000Z\nRRULE:FREQ=WEEKLY;UNTIL=20220330\nEXDATE:20190614T120000Z\nEXDATE:20190628T120000Z'
    

    请注意有 2 个 EXDATE 属性,对于要排除的每个日期,您需要放置一个 EXDATE。 我花了 3 天时间试图让它工作,希望这将有助于节省其他人的时间。

    【讨论】:

    • 我假设这只是为我节省了 3 天的时间。我欠你很多债。
    • 当心,fullcalendar/rrule 连接器中当前存在一个错误,如果您以 UTC 格式(尾随 Z)提供日期,则会导致多个 EXDATE 无法正常工作。见github.com/fullcalendar/fullcalendar/issues/5726
    • 伙计,你节省了我不少时间和精力!
    • @jiroch 为 RRule 日期时间添加 'Z' 字符现在可以在 v5.4.0 github.com/fullcalendar/fullcalendar/issues/5726 中使用
    • for each date you want to exclude 是什么意思?所以你是说如果我想排除 05/03/2021 那么那个日期必须有两次?如果是这样,在您的示例中,我每个日期只看到一个:20190614T120000Z20190628T120000Z,它们不匹配。
    【解决方案4】:

    这种格式也可以用于多个EXDATE:

    rrule: "DTSTART:20201114T000000Z\nRRULE:FREQ=WEEKLY\nEXDATE:20201121T000000Z,20201128T000000Z"
    

    这个字符串是使用 rrule.js 库中的 rruleSet.exdate(new Date(Date.UTC(2012, 5, 1, 10, 30))) 格式化的,以便在 rrule 对象中添加多个 EXDATE,然后使用方法 .toString()

    另外,请注意,为 RRule 日期时间添加“Z”字符现在可以在 v5.4.0 中使用

    【讨论】:

      【解决方案5】:

      在最新版本 5.4.0 中,以下代码将起作用:

      DTSTART:20201101T040000Z RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=TU EXDATE:20201110T040000Z,20201124T040000Z

      FullCalendar 现在支持多个 exdate

      我使用 RRule 和 RRuleSet 来生成 rrule 字符串: *注意:您必须小心夏令时。这就是为什么我不得不调整几次。不要专注于我的特定日期对象。这只是使用 RRuleSet 和 RRule 支持多个 exdates 的解决方案的一个示例。

      const rruleSet = new RRuleSet();
          rruleSet.rrule(new RRule({
            freq: Frequency.WEEKLY,
            interval: 1,
            byweekday: [RRule.TU],
            dtstart: new Date(2020, 10, 1, 0, 0, 0, 0)
          }));
          rruleSet.exdate(new Date(2020, 10, 9, 23, 0, 0, 0));
          rruleSet.exdate(new Date(2020, 10, 23, 23, 0, 0, 0));
          console.log(rruleSet.toString());
      

      这是问题编号: https://github.com/fullcalendar/fullcalendar/issues/5726

      【讨论】:

      • 你确定吗?当我尝试使用 EXDATE 解析 RRULE 时,它说 EXDATE 是无效属性。
      • 当我保存字符串并尝试让 fullcalendar 在稍后阶段使用该字符串时,我得到以下信息:EXDATE 中不支持的 RFC prop EXDATE:20201109T210000Z,20201123T210000Z。 Fullcalendar 无法在稍后阶段解析这些 EXDATES。见github.com/jakubroztocil/rrule/issues/335github.com/fullcalendar/fullcalendar/issues/4549
      • 使用 RRuleSet 而不是 RRule 并确保您使用的是完整日历版本 5.4.0
      • 我有一大堆带有 EXDATE 的 JSON 事件数据。当我将此发送到 fullcalendar 时,它会抛出一个错误,指出 EXDATE 无效。您如何将 RRuleSet 纳入 Fullcalendar 5.4.0?
      • @PiotrStulinski 发布你的 RRULE 样本,我会看看
      猜你喜欢
      • 1970-01-01
      • 2014-09-29
      • 1970-01-01
      • 2023-04-08
      • 2017-06-30
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多