Fullcalendar太平洋时区重复事件转UTC时日期提前一天问题
问题根因
该偏移问题核心是 rrule默认基于dtstart的UTC日期计算星期值,和场景中使用的太平洋时区(PT)存在跨天偏移,导致星期匹配逻辑错位:
- 输入的PT时间11月22日(周一)18:30,转换为UTC时间为11月23日(周二)02:30,
dtstart的UTC日期对应的星期为周二 - rrule中配置的
byweekday: [0,3]对应周一、周四,rrule会基于UTC日期的星期做匹配,最终渲染时Fullcalendar把UTC时间转回PT时区,就会出现提前1天的偏移 - 下午3点前的PT时间转UTC不会跨天、非重复事件不需要走rrule的重复星期匹配逻辑,所以这两类场景没有异常
修复方案
方案1(推荐:适配时区规则)
- 引入时区处理依赖:Fullcalendar 5.x需要搭配
@fullcalendar/luxon2或@fullcalendar/moment-timezone插件实现自定义时区支持 - 把Fullcalendar的
timeZone参数从local改为明确的时区标识America/Los_Angeles(对应太平洋时区) - 修改rrule配置,增加时区标识,且
dtstart使用PT本地时间格式(不带UTC后缀Z):
"rrule": { "freq": 2, "interval": 1, "byweekday": [0, 3], "dtstart": "2021-11-22T18:30:00", "until": "2021-11-29T20:30:00", "tzid": "America/Los_Angeles" }
该方案会让rrule基于太平洋时区的日期计算重复规则,天然适配夏令时变动,不会出现跨天偏移。
方案2(临时适配:不改动时区配置)
如果暂时无法接入时区插件,可以调整byweekday的取值匹配UTC时间的星期:原PT时区的周一、周四对应UTC时区的周二、周五,把byweekday改为[1,4]即可临时修复问题。注意该方案不兼容夏令时切换,每年夏令时、冬令时切换时会再次出现偏移,仅建议临时测试使用。
内容的提问来源于stack exchange,提问作者Xiilxvi
相关产品推荐
相关产品推荐

