首页 > 解决方案 > 谷歌日历 CalDAV 时间范围不起作用

问题描述

我试图在一个时间范围内获取所有事件。这是我的 CalDAV 请求正文:

<?xml version="1.0" encoding="UTF-8"?>
<C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
   <D:prop xmlns:D="DAV:">
      <C:calendar-data />
   </D:prop>
   <C:filter>
      <C:comp-filter name="VEVENT">
         <C:time-range end="20200920T134847" start="20200919T134847" />
      </C:comp-filter>
   </C:filter>
</C:calendar-query>

可以看出,我使用了时间范围分量过滤器。不幸的是,这也会返回时间范围之外的事件:

...
DTSTART;TZID=Europe/Amsterdam:20200522T111028
DTEND;TZID=Europe/Amsterdam:20200522T121028
...

谁能看到出了什么问题?

我看到了这个这个例子,它将VEVENTcomp-filter 放在VCALENDARcomp-filter 中,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">
   <d:prop>
      <d:getetag>
         <c:calendar-data>
            <c:comp name="VCALENDAR">
               <c:prop name="VERSION">
                  <c:comp name="VEVENT">
                     <c:prop name="SUMMARY">
                        <c:prop name="UID">
                           <c:prop name="DTSTART">
                              <c:prop name="DTEND">
                                 <c:prop name="DURATION">
                                    <c:prop name="RRULE">
                                       <c:prop name="RDATE">
                                          <c:prop name="EXRULE">
                                             <c:prop name="EXDATE">
                                                <c:prop name="RECURRENCE-ID" />
                                             </c:prop>
                                          </c:prop>
                                       </c:prop>
                                    </c:prop>
                                 </c:prop>
                              </c:prop>
                           </c:prop>
                        </c:prop>
                     </c:prop>
                  </c:comp>
                  <c:comp name="VTIMEZONE" />
               </c:prop>
            </c:comp>
         </c:calendar-data>
      </d:getetag>
   </d:prop>
   <c:filter>
      <c:comp-filter name="VCALENDAR">
         <c:comp-filter name="VEVENT">
            <c:time-range start="20060104T000000Z" end="20060105T000000Z" />
         </c:comp-filter>
      </c:comp-filter>
   </c:filter>
</c:calendar-query>

所以我尝试了以下方法:

<?xml version="1.0" encoding="UTF-8"?>
<C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
   <D:prop xmlns:D="DAV:">
      <C:calendar-data />
   </D:prop>
   <C:filter>
      <C:comp-filter name="VCALENDAR">
         <C:comp-filter name="VEVENT">
            <C:time-range end="20200920T135938" start="20200919T135938" />
         </C:comp-filter>
      </C:comp-filter>
   </C:filter>
</C:calendar-query>

但随后谷歌给出了以下错误信息:

<?xml version="1.0" encoding="UTF-8"?>
<errors xmlns="http://schemas.google.com/g/2005">
 <error>
  <domain>GData</domain>
  <code>badRequest</code>
  <internalReason>Bad Request</internalReason>
 </error>
</errors>

我似乎无法弄清楚出了什么问题。

//更新:

我尝试了 icalendar.org 中的示例,这似乎有效。唯一的问题是我无法使用 caldav4j 复制该请求正文。

我还尝试从 caldav4j 复制确切的示例:

<?xml version="1.0" encoding="UTF-8"?>
<C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
   <D:prop xmlns:D="DAV:">
      <D:getetag />
      <C:calendar-data>
         <C:comp name="VCALENDAR">
            <C:comp name="VEVENT">
               <C:prop name="SUMMARY" />
               <C:prop name="UID" />
               <C:prop name="DTSTART" />
               <C:prop name="DTEND" />
               <C:prop name="DURATION" />
               <C:prop name="RRULE" />
               <C:prop name="RDATE" />
               <C:prop name="EXRULE" />
               <C:prop name="EXDATE" />
               <C:prop name="RECURRENCE-ID" />
            </C:comp>
            <C:comp name="VTIMEZONE" />
            <C:prop name="VERSION" />
         </C:comp>
      </C:calendar-data>
   </D:prop>
   <C:filter>
      <C:comp-filter name="VCALENDAR">
         <C:comp-filter name="VEVENT">
            <C:time-range end="20200920T161921" start="20200919T161921" />
         </C:comp-filter>
      </C:comp-filter>
   </C:filter>
</C:calendar-query>

不幸的是,它给出了另一个 badRequest 响应。

标签: google-calendar-apiicalendarcaldav

解决方案


最后,我最终切换到另一个 CalDAV 服务器 (Radicale) 进行服务器端日志记录。事实证明,时间符号应该以“Z”结尾。


推荐阅读