在 google 日历 api 时间之间找到空位

find an open slot in google calendar api between time

我正在努力迭代 google 日历 api 中的一个时间间隔并检查是否有空位,例如: 我有一个从 12:10 pm 到 6:30 pm 的时间间隔,并且有 3 个事件从 12:10 到 3 pm 和 3:10 到 4:25 和 5: 00 到6:20 pm,那天我想检查的事件持续时间为 25 分钟,我想在那个时间段内迭代,并可能将其放在 4:25pm 到 5:50pm 之间. 我试过了,但方法不对:

def set_window_filter(title, windowx1, windowx2, event_duration, calendar, next_day):
    schedule_date = None
    if (windowx1 is not None) and (windowx2 is not None):

        x = datetime.strptime(
            windowx1, '%I:%M %p')

        y = datetime.strptime(
            windowx2, '%I:%M %p')

        start_date = datetime.combine(
            next_day.date(), x.time())
        
        event_between_date = start_date
        
        event_end_date = event_between_date + timedelta(minutes=event_duration)
        
        end_date = datetime.combine(
            next_day.date(), y.time())
        
        while event_end_date <= end_date:
            if event_end_date >= end_date - timedelta(minutes=(event_duration)):
                return None, False
            
            if event_between_date < event_end_date:
                event_value, events = calendar.calendar_event_func(
                    event_between_date, event_end_date)
                print('event_value, events: ', event_value, events)
            
            if event_value is None:
                print('event_value: ', event_value)
                schedule_date = event_between_date.strftime(
                    '%A, %d, %B, %Y       %I:%M %p')
                return schedule_date, False

            else:
                event_between_date += timedelta(minutes=10)
                event_end_date += timedelta(minutes=10)

基本上 windowx1 和 windowx2 都是时间段的输入,比如 1 PM TO 5 PM

event_value, events = calendar.calendar_event_func(
                    event_between_date, event_end_date)

此函数将 return 事件值(即 True)和事件列表,如果找到给定时间段和 None 之间的任何事件,如果 none 找到, 还有什么比这更好的方法呢。

下面的这个函数将查找可以安排所需持续时间的会议的最早可用时间。例如,如果所需的 window 是从 5 到 10,所需的持续时间是 1 小时并且存在从 5:30 到 6:45 的现有会议,则函数将 return 6:45 时间。

def findFirstOpenSlot(events,startTime,endTime,duration):

    def parseDate(rawDate):
        #Transform the datetime given by the API to a python datetime object.
        return datetime.datetime.strptime(rawDate[:-6]+ rawDate[-6:].replace(":",""), '%Y-%m-%dT%H:%M:%S%z')

    eventStarts = [parseDate(e['start'].get('dateTime', e['start'].get('date'))) for e in events]
    eventEnds = [parseDate(e['end'].get('dateTime', e['end'].get('date'))) for e in events]

    gaps = [start-end for (start,end) in zip(eventStarts[1:], eventEnds[:-1])]
    
    if startTime + duration < eventStarts[0]:
        #A slot is open at the start of the desired window.
        return startTime

    for i, gap in enumerate(gaps):
        if gap > duration:
            #This means that a gap is bigger than the desired slot duration, and we can "squeeze" a meeting.
            #Just after that meeting ends.
            return eventEnds[i]

    #If no suitable gaps are found, return none.
    return None


函数参数如下:

  • 事件:通过events.get.
  • 获得的原始事件列表objects
  • startTime , endTime: 新事件应该放置的所需 window 的开始和结束,如一个 python 日期时间.
  • duration:新事件的持续时间,作为python timedelta.

如果无法安排会议,该功能将returnNone。这样,您就可以继续使用 event.insert.

创建新事件