微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Google日历CalDAV时间范围不起作用

如何解决Google日历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
...

任何人都可以看到出了什么问题吗?

我看到了thisthis的示例,该示例将VEVENT comp-filter放置在VCALENDAR comp-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>

但是随后Google给出了以下错误消息:

<?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>

我似乎无法弄清楚哪里出了问题。

//更新:

我尝试了the example from 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响应。

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。