Caldav 未在时间范围查询内返回事件

Posted

技术标签:

【中文标题】Caldav 未在时间范围查询内返回事件【英文标题】:Caldav not returning event within time-range query 【发布时间】:2020-10-13 11:54:00 【问题描述】:

我的 Sabre 中有一个 iCalendar 活动:

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//CalDAV Client//EN
BEGIN:VEVENT
UID:5e44cec8-33ed-4f24-82c7-f33483afa50d
DTSTART:20200805T080000Z
SUMMARY:summary
STATUS:CONFIRMED
TRANSP:OPAQUE
DURATION:PT30M
CATEGORIES:RESERVATION
DTSTAMP:20200716T211928Z
END:VEVENT
END:VCALENDAR

'2020-08-05T08:00:00.000Z'开始,持续30分钟,在'2020-08-05T08:30:00.000Z'结束。

如果我提交以下查询:

<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav"
    xmlns:cs="http://calendarserver.org/ns/"
    xmlns:ca="http://apple.com/ns/ical/"
    xmlns:d="DAV:">
    <d:prop>
        <c:calendar-data />
    </d:prop>
    <c:filter>
        <c:comp-filter name="VCALENDAR">
            <c:comp-filter name="VEVENT">
                <c:time-range start="20200805T080000Z" end="20200805T180000Z"/>
            </c:comp-filter>
        </c:comp-filter>
    </c:filter>
    <c:timezone>GMT</c:timezone>
</c:calendar-query>

提到的事件被返回。但是,如果我将start=... 移动一秒钟,就像start="20200805T080001Z" 一样,它不会被返回。

根据9.9 or Caldav RFC 4791 部分,它应该被退回。上述部分的条件:

(start <  DTSTART+DURATION AND end > DTSTART) 

【问题讨论】:

【参考方案1】:

我想通了,我使用的是 Mongo 后端而不是 Sabre 的 PDO 后端,并且提到的 Mongo 后端有一个 PDO 没有的错误。

导致错误的一段代码:

$endDate = clone $component->DTSTART->getDateTime();
$endDate->add(VObject\DateTimeParser::parse($component->DURATION->getValue()));
$lastOccurence = $endDate->getTimeStamp();

endDate 是不可变日期,因此需要重新分配 endDate 以使 add 函数生效。

固定代码:

$endDate = clone $component->DTSTART->getDateTime();
$endDate = $endDate->add(VObject\DateTimeParser::parse($component->DURATION->getValue()));
$lastOccurence = $endDate->getTimeStamp();

您还可以在 PDO 后端here 的 github 页面上看到此正确实现。

【讨论】:

以上是关于Caldav 未在时间范围查询内返回事件的主要内容,如果未能解决你的问题,请参考以下文章

数据“未在此范围内声明的成员”

错误:未在此范围内声明“对象”

qrand 未在此范围内声明

C++ Win API 函数'未在此范围内声明'

未在此范围内声明 CvSVM 错误

C++ 错误:未在此范围内声明类/对象