You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Google Calendar PHP客户端库时EXDATE重复规则被忽略问题

解决Google Calendar PHP客户端EXDATE规则被忽略的问题

我之前也碰到过类似的情况,你的RRULE生效但EXDATE被忽略,大概率是EXDATE的格式和事件的时间类型不匹配导致的,具体来说:

你的事件是带具体时间的定时事件(使用了dateTime字段,包含时分秒),但你用了VALUE=DATE的纯日期格式来定义EXDATE,Google Calendar无法将纯日期的排除规则关联到带具体时间的重复事件上,所以直接忽略了这条规则。

给你两种针对性的解决方案:

方案一:针对定时事件修改EXDATE格式

把EXDATE改成带时区的DATE-TIME格式,和你的事件起始时间保持一致:

  1. 先处理你的起始时间格式,把HH:MM转换成HHMMSS(比如09:00变成090000
  2. 构造带时区的EXDATE规则

修改后的代码示例:

// 处理起始时间格式,去掉冒号补全秒数
$cleanStartTime = str_replace(':', '', $slot['startTime']) . '00';

// 构造排除规则,指定时区和具体时间
$arrRecurrence = array(
    "EXDATE;TZID=America/New_York:20180219T{$cleanStartTime}",
    "RRULE:FREQ=WEEKLY;UNTIL=20180224;BYDAY=MO"
);

方案二:如果是全天事件,调整事件和EXDATE格式

如果你的事件实际是全天事件,那可以把startend字段改成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

火山引擎 最新活动