使用Google Calendar PHP客户端库时EXDATE重复规则被忽略问题
解决Google Calendar PHP客户端EXDATE规则被忽略的问题
我之前也碰到过类似的情况,你的RRULE生效但EXDATE被忽略,大概率是EXDATE的格式和事件的时间类型不匹配导致的,具体来说:
你的事件是带具体时间的定时事件(使用了dateTime字段,包含时分秒),但你用了VALUE=DATE的纯日期格式来定义EXDATE,Google Calendar无法将纯日期的排除规则关联到带具体时间的重复事件上,所以直接忽略了这条规则。
给你两种针对性的解决方案:
方案一:针对定时事件修改EXDATE格式
把EXDATE改成带时区的DATE-TIME格式,和你的事件起始时间保持一致:
- 先处理你的起始时间格式,把
HH:MM转换成HHMMSS(比如09:00变成090000) - 构造带时区的EXDATE规则
修改后的代码示例:
// 处理起始时间格式,去掉冒号补全秒数 $cleanStartTime = str_replace(':', '', $slot['startTime']) . '00'; // 构造排除规则,指定时区和具体时间 $arrRecurrence = array( "EXDATE;TZID=America/New_York:20180219T{$cleanStartTime}", "RRULE:FREQ=WEEKLY;UNTIL=20180224;BYDAY=MO" );
方案二:如果是全天事件,调整事件和EXDATE格式
如果你的事件实际是全天事件,那可以把start和end字段改成date类型(注意全天事件的end日期是事件结束的次日),同时保留VALUE=DATE的EXDATE格式:
$params = array( 'summary' => 'Event Title', 'location' => 'Event Location', 'start' => array( 'date' => $slot['startDate'], 'timeZone' => 'America/New_York', ), 'end' => array( 'date' => date('Ymd', strtotime($slot['startDate'] . ' +1 day')), // 全天事件end是次日 'timeZone' => 'America/New_York', ), 'recurrence' => array( 'EXDATE;VALUE=DATE:20180219', 'RRULE:FREQ=WEEKLY;UNTIL=20180224;BYDAY=MO' ), 'attendees' => $arrAttendees, );
修改完成后调用update()方法,再去Google Calendar后台检查,应该就能看到2018年2月19日的事件被成功排除了。
内容的提问来源于stack exchange,提问作者Peter Li




