【问题标题】:icalendar AssertionError: VTIMEZONEs sub-components' DTSTART must be of type datetime, not dateicalendar AssertionError:VTIMEZONEs 子组件的 DTSTART 必须是 datetime 类型,而不是 date
【发布时间】:2020-07-11 22:55:06
【问题描述】:

当我在 Python 3.75 中运行这段代码时,vscode:

from icalendar import Calendar 
import requests
SkeddaBridgeURL = 'https://bridgeartspace.skedda.com/ical?key=457bda7'
f=requests.get(SkeddaBridgeURL)
c = Calendar.from_ical(f.text)

我收到此错误:

VTIMEZONEs sub-components' DTSTART must be of type datetime, not date
  File "/Users/jeff/Scrape/Code/skedda.py", line 6, in <module>
    c = Calendar.from_ical(f.text)

但是当我通过 https://icalendar.org/validator.html 的 ical 验证器运行此 URL 时,我没有收到任何错误。

我觉得没有资格称这是一个错误,但也许是!

我尝试处理的一种方法是通过启动标志来抑制断言错误,如下所示: python 3 -Oc "Assert False"

但我看不到如何在 VSCode 中将其设置为标志,我也在学习。

此外,在此代码上运行调试器,通过 pip3 安装了icalendar,我无法进入代码或修改它。我需要弄清楚如何从 github 下载整个模块并删除断言吗?

【问题讨论】:

  • 在 VSC 之外运行它会出现什么错误?
  • 在命令行上出现同样的错误,除非我添加了 -Oc "Assert False" 标志。
  • 看起来数据确实有缺陷,这意味着验证器也是。抑制断言异常可能有效,也可能无效。您可以在下载数据后和转换之前修复数据。它只是一个文本文件,其格式记录在 RFC 2445 和 5545 中,因此在 Python 中进行调整应该不会太难。或者你可以试试 ics 库而不是 icalendar,看看它是否更宽容。

标签: python visual-studio-code icalendar assertion


【解决方案1】:

时区夏令时更改从 DATE 和 TIME 开始,而不仅仅是一天,因此它必须是 DATE-TIME 而不是 DATE。来自https://icalendar.org/iCalendar-RFC-5545/3-6-5-time-zone-component.html

强制性的“DTSTART”属性给出了生效日期和 时区子组件定义的本地时间。 "DTSTART" 在 此用法必须指定为具有本地时间值的日期。

根据我的经验,不同的验证器并不能满足所有要求,所以我尝试检查所有我能找到的东西。此外,各种主要的日历应用程序并不都支持 RFC5545 规范中的所有内容。 (例如:我上次检查的谷歌日历没有按小时重复。)因此最好也对主要的日历应用程序进行测试。 Google 过去对文件非常挑剔,但总是不提供好的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 2016-11-13
    相关资源
    最近更新 更多