使用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
相关产品推荐
相关产品推荐

