我有一个.ics文件,我想从中提取今天发生的所有事件。我想我在将icalendar、DTSTART和DTEND转换为python日期时时遇到了问题。我在icalendar.readthedocs.org尝试过跟踪文档。我得到的清单是空的,不应该是这样的。
这是我的密码:
import urllib2
import json
from datetime import datetime
from icalendar import Calendar, Event, vDatetime
def getTodayEvents(icsFile):
cal = Calendar.from_ical(icsFile)
today = datetime.now().date()
entries = []
for event in cal.walk('VEVENT'):
dtstart = event['DTSTART']
dtend = event['DTEND']
start = vDatetime.from_ical(dtstart) //Trouble here?
end = vDatetime.from_ical(dtend)
if start <= today <= end:
entry = {'summary' : event['SUMMARY'] }
entries.append(entry)
output = json.dumps(entries)
return output //This list is empty这就是和ics条目的样子:
BEGIN:VEVENT
SUMMARY:Jonny Smith
DTSTART;VALUE=DATE:20140731
DTEND;VALUE=DATE:20150802
UID: 12345
CLASS:PUBLIC
PRIORITY:5
DTSTAMP:20141006T160145Z
TRANSP:OPAQUE
STATUS:CONFIRMED
SEQUENCE:0
LOCATION:Mansfield\, GA
X-MICROSOFT-CDO-APPT-SEQUENCE:0
X-MICROSOFT-CDO-BUSYSTATUS:FREE
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-CDO-INSTTYPE:0
X-MICROSOFT-DISALLOW-COUNTER:FALSE
END:VEVENT发布于 2014-10-12 19:32:33
DTSTART,DTEND属性具有.dt属性:
#!/usr/bin/env python
import json
from datetime import date
import icalendar # $ pip install icalendar
today = date.today()
calendar = icalendar.Calendar.from_ical(ics_file)
entries = [dict(summary=event['SUMMARY'])
for event in calendar.walk('VEVENT')
if event['DTSTART'].dt <= today <= event['DTEND'].dt]
print(json.dumps(entries, indent=2, sort_keys=True))输出
[
{
"summary": "Jonny Smith"
}
]发布于 2019-01-28 09:26:12
event对象有一个方法.decoded(),它为您提供一个datetime.date对象(在您的示例中,.ics只有一个日期)或一个datetime.datetime对象。对于datetime.datetime对象,还需要转换正确的时区。
为了进行统一的比较,我将所有内容转换为字符串,然后比较字符串。最后,我编写了一个isEventToday方法:
from datetime import datetime, timezone, timedelta
def isEventToday(event):
if event.get('dtstart') == None:
dtstart = ""
else:
temp = event.decoded('dtstart')
if isinstance(temp, datetime):
dtstart = temp.astimezone().strftime("%Y-%m-%d")
else:
dtstart = temp.strftime("%Y-%m-%d")
if event.get('dtend') == None:
dtend = ""
else:
temp = event.decoded('dtend')
if isinstance(temp, datetime):
dtend = temp.astimezone().strftime("%Y-%m-%d")
else:
# dtend for day events is the day AFTER the event, so we
# need to substract one!
dtend = (temp - timedelta(days=1)).strftime("%Y-%m-%d")
today = datetime.today().date().strftime("%Y-%m-%d")
if dtstart != "" and dtstart == today:
return True
if dtend != "" and dtend == today:
return True
if dtstart != "" and dtend != "" and dtstart <= today and today <= dtend:
return True
return False这段代码在我看来不太好,但它正在起作用。
发布于 2014-10-07 15:42:03
检查if start <= today <= end:比较中数据类型或内容之间是否存在差异。看看这三个变量的类型和内容(大约在调试器中)。我认为你会发现比较是比较合法的东西,但不兼容给你所期望的答案(例如,这个事件的开始和结束时间是否与今天的日期重叠?)
您的today是一个datetime结构,可以根据您的意愿与其他datetime进行比较。也许您的vDatetime.from_ical(dtstart)返回的不是datetime。不过,快速浏览一下来源看起来应该会返回一个datetime。也许你有时区问题?查看这三种内容的内容,并检查哪些是<、==或>其他。
如果是这样的话,在调用vDatetime.from_ical()调用时添加一个时区;
start = vDatetime.from_ical(dtstart,'Europe/Amsterdam') #or wherever you are您在.ics的时间表示Z -即格林尼治标准时间。
如果您需要对日期做更多的工作,请参见与时间一起工作。
https://stackoverflow.com/questions/26238835
复制相似问题