0

好的,所以我已经看到了与此类似的问题,但其中大多数是关于不同语言的,似乎没有一个属于 Python 领域。我还在 Google 上的文档中搜索了在日历中列出事件的不同选项。谷歌没有列出按州日期顺序限制结果的方法,只有开始时间。

所以,我希望有人可以帮助我从日历中检索事件,让它们按顺序排列,同时将结果限制在特定日期。最好我不想让任何事件超过 30 天,并按开始时间和日期排序。我的猜测,虽然我不确定最好的方法,但可能是获取所有事件,将它们放入列表或字典中,然后按我想要的顺序枚举该列表或字典,然后做一些if 语句从列表或字典中删除超过 30 天的任何内容。下面是我正在使用的代码,然后是我在终端中得到的响应。正如你所看到的,我得到了一年后的日期,而且它们都出了问题。哦,这样你就不会感到困惑,这段代码是从我在谷歌整个日历的多个部分中提取的。此外,您会注意到我将结果限制为最多 5 个以使测试更容易,因此我没有返回 100 个结果。

try:
  #  -----  Facebook Birthday Calendar  -----
  page_token = None
  interval = 0
  while True:
    events = service.events().list(calendarId='my calendar id', pageToken=page_token).execute()
    for event in events['items']:
      if interval < 5:
    dt = dateutil.parser.parse(event['start']['date'])
    print event['summary'], dt.strftime('%d %m %Y')
    page_token = events.get('nextPageToken')
    interval += 1
  else:
    break
    if not page_token:
  break
print "-----"

#  -----  My Gmail Calendar  -----
page_token_two = None
interval_two = 0
while True:
  events_two = service.events().list(calendarId='my calendar id', pageToken=page_token_two).execute()
  for event_two in events_two['items']:
    if interval_two < 5:
  dt_two = dateutil.parser.parse(event_two['start']['dateTime'])
  dstime_two = dateutil.parser.parse(event_two['start']['dateTime'])
  detime_two = dateutil.parser.parse(event_two['end']['dateTime'])
      print event_two['summary'] + " " + dt_two.strftime('%d %m %Y') + " " + dstime_two.strftime('%H%M') + "-" + detime_two.strftime('%H%M')
      # print event_two['summary'], dt_two.strftime('%d %m %Y')
  page_token_two = events_two.get('nextPageToken')
  interval_two += 1
else:
  break
  if not page_token_two:
break
print "-----"

#  -----  US Holidays Calendar  -----
page_token_three = None
interval_three = 0
while True:
  events_three = service.events().list(calendarId='my calendar id', pageToken=page_token_three).execute()
  for event_three in events_three['items']:
    if interval_three < 5:
  dt_three = dateutil.parser.parse(event_three['start']['date'])
  print event_three['summary'], dt_three.strftime('%d %m %Y')
  page_token_three = events_three.get('nextPageToken')
  interval_three += 1
else:
  break
  if not page_token_three:
break
print "-----"

结果:

Person's Birthday 17 03 2014
Person's Birthday 20 09 2013
Person's Birthday 10 09 2013
Person's Birthday 17 04 2014
Person's Birthday 29 04 2014
-----
Work 12 04 2013 1430-2330
Work 15 04 2013 1415-2315
Work 22 04 2013 1415-2315
Work 25 04 2013 1405-2305
Work 29 04 2013 0640-0230
-----
Patriot Day 11 09 2012
Thanksgiving 28 11 2013
Groundhog Day 02 02 2014
Memorial Day 28 05 2012
Lincoln's Birthday 12 02 2013
-----
4

1 回答 1

0

Python 日期时间对象非常易于使用。例如,您可以将事件和日期时间信息收集到元组列表中,如下所示:

all_events = []
for <loop over events from server>:
    all_events.append((dateutil.parser.parse(event['start']['date']), event['summary']))

然后您可以过滤和排序这些元组,使用您可以添加/减去日期时间并获取 timedelta 对象的事实。您可以简单地与代表 30 天差异的 timedelta 对象进行比较:

from datetime import datetime, timedelta

max_td = timedelta(days=30)
now = datetime.now()

# Remove events that are too far into the future
filtered_events = filter(lambda e: e[0] - now <= max_td, all_events)

# Sort events in ascending order of start time
filtered_events.sort()
于 2013-07-14T14:42:57.013 回答