首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用icalendar解析日期并与python进行比较

用icalendar解析日期并与python进行比较
EN

Stack Overflow用户
提问于 2014-10-07 14:49:38
回答 3查看 6.3K关注 0票数 2

我有一个.ics文件,我想从中提取今天发生的所有事件。我想我在将icalendar、DTSTART和DTEND转换为python日期时时遇到了问题。我在icalendar.readthedocs.org尝试过跟踪文档。我得到的清单是空的,不应该是这样的。

这是我的密码:

代码语言:javascript
复制
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条目的样子:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-12 19:32:33

DTSTART,DTEND属性具有.dt属性:

代码语言:javascript
复制
#!/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))

输出

代码语言:javascript
复制
[
  {
    "summary": "Jonny Smith"
  }
]
票数 4
EN

Stack Overflow用户

发布于 2019-01-28 09:26:12

event对象有一个方法.decoded(),它为您提供一个datetime.date对象(在您的示例中,.ics只有一个日期)或一个datetime.datetime对象。对于datetime.datetime对象,还需要转换正确的时区。

为了进行统一的比较,我将所有内容转换为字符串,然后比较字符串。最后,我编写了一个isEventToday方法:

代码语言:javascript
复制
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

这段代码在我看来不太好,但它正在起作用。

票数 2
EN

Stack Overflow用户

发布于 2014-10-07 15:42:03

检查if start <= today <= end:比较中数据类型或内容之间是否存在差异。看看这三个变量的类型和内容(大约在调试器中)。我认为你会发现比较是比较合法的东西,但不兼容给你所期望的答案(例如,这个事件的开始和结束时间是否与今天的日期重叠?)

您的today是一个datetime结构,可以根据您的意愿与其他datetime进行比较。也许您的vDatetime.from_ical(dtstart)返回的不是datetime。不过,快速浏览一下来源看起来应该会返回一个datetime。也许你有时区问题?查看这三种内容的内容,并检查哪些是<==>其他。

如果是这样的话,在调用vDatetime.from_ical()调用时添加一个时区;

代码语言:javascript
复制
start = vDatetime.from_ical(dtstart,'Europe/Amsterdam') #or wherever you are

您在.ics的时间表示Z -即格林尼治标准时间。

如果您需要对日期做更多的工作,请参见与时间一起工作

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26238835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档