Google Calendar API V3 TimeMax и TimeMin Функциональность

Я пытаюсь использовать API Календаря Google v3 в Python, чтобы вернуть все события на определенную дату.

Пока что я объявил свои даты следующим образом:

today_beginning = datetime.datetime.combine(date.today(), time())
today_end = today_beginning + datetime.timedelta(1, 0) - datetime.timedelta(0, 1)

today_beginning = today_beginning.isoformat() + 'Z'
today_end = today_end.isoformat() + 'Z'

Затем я делаю вызов API, используя эти даты

eventsResult = service.events().list(
    calendarId=cal_id.calendarId, timeMin=today_beginning, timeMax=today_end).execute()

Проблема в том, что события до моей даты timeMin тоже возвращаются.

Может быть, я плохо понимаю API документации?

Для справки, если бы сегодня было 10 января 2016 года, время начала и окончания выглядело бы следующим образом:

2016-01-10T00:00:00Z
2016-01-10T23:59:59Z

2 ответа

Обратите внимание, что вы установили даты в часовом поясе UTC

2016-01-10T00:00:00Z
2016-01-10T23:59:59Z

Z обозначает Zulu = часовой пояс UTC

Так что, если часовой пояс вашего календаря не UTC - установленный вами период не будет совпадать 2016-01-10 (это будет сдвиг в соответствии с часовым поясом вашего календаря)

Не уверен, что не так с вашим кодом, но вот мое исправление, чтобы правильно вычесть время в формате UTC.

Примечание. Я начал с их примера кода с той же страницы, на которую вы ссылаетесь в документации по API. И в этом примере используется только timeMin.

Начнем с объявления дат:

tmin = datetime.datetime.utcnow() - datetime.timedelta(hours=24)
time = tmin.isoformat() + 'Z'

Затем, используя тот же формат для вызова API

events_result = service.events().list(
  calendarId='primary', timeMin=time, maxResults=10, singleEvents=True, orderBy='startTime').execute()

Это просто вычитает 24 часа из времени, найденного datetime.datetime.utcnow() для вашего календаря.

Я предполагаю, что для timeMax вы могли бы сделать то же самое, но вместо этого добавить datetime.timedelta(). Его можно добавить к вашему текущему времени utcnow() или добавить к timeMin времени tmin.

Из документов:

timeMin: Lower bound (inclusive) for an event's end time to filter by. Optional. The default is not to filter by end time. Must be an RFC3339 timestamp with mandatory time zone offset, e.g., 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided but will be ignored. (string)

поэтому события, которые начинаются до timeMin, будут включены, если они заканчиваются после timeMin

Другие вопросы по тегам