You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用rrule.js的rrulestr解析含EXDATE规则时DTSTART与UNTIL异常咨询

rrule.js中rrulestr解析含EXDATE规则时dtstart与until异常问题

问题复现代码

const rrule = rrulestr(
        `DTSTART:20190610T103000\nRRULE:FREQ=DAILY;INTERVAL=1;UNTIL=20190801\nEXDATE:20190618T103000Z\nEXDATE:20190619T103000`
    )

异常表现

  • rrule.options.dtstart未匹配规则字符串中设定的20190610T103000,而是取当前时间
  • rrule.options.until值为null
  • 移除所有EXDATE后,dtstart和until均能正常匹配规则字符串中的设定

问题原因

核心问题是EXDATE的时区格式不统一:你提供的两个EXDATE一个带Z标识(UTC时区),一个不带(本地时区)。这种混合时区的EXDATE会干扰rrulestr对基础规则(DTSTART、UNTIL)的解析逻辑,导致解析流程异常,无法正确提取并保留原规则中的dtstart和until参数。

解决方案

统一所有EXDATE的时区格式,确保与DTSTART的时区保持一致:

方案1:统一为本地时区(与DTSTART格式一致)

const rrule = rrulestr(
        `DTSTART:20190610T103000\nRRULE:FREQ=DAILY;INTERVAL=1;UNTIL=20190801\nEXDATE:20190618T103000\nEXDATE:20190619T103000`
    )

方案2:统一为UTC时区(所有时间都带Z标识)

注意同步调整DTSTART和UNTIL的格式,确保时区一致:

const rrule = rrulestr(
        `DTSTART:20190610T103000Z\nRRULE:FREQ=DAILY;INTERVAL=1;UNTIL=20190801T235959Z\nEXDATE:20190618T103000Z\nEXDATE:20190619T103000Z`
    )

补充说明

虽然rrule实例本身没有exdate属性,但rrulestr会将解析后的EXDATE集合存储在rrule.origOptions.exdate中,可通过该属性查看已排除的日期,验证解析结果是否正确。

内容的提问来源于stack exchange,提问作者benny hassan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 09:57:18