Caldav 不在时间范围查询内返回事件
Caldav not returning event within time-range query
我的 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)
我想通了,我正在使用 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 后端 github 页面上看到此正确实现 here。
我的 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)
我想通了,我正在使用 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 后端 github 页面上看到此正确实现 here。