【问题标题】:Google Calendar API doesn't accept DateTime with positive UTC offset?Google Calendar API 不接受带有正 UTC 偏移的 DateTime?
【发布时间】:2026-02-07 09:10:02
【问题描述】:

我正在开发一个 iOS 应用程序,它可以访问 Google 日历以显示即将进行的直播的日期。

Google claims 对于任何采用 DateTime 的参数,它必须格式化为 ISO 8601,我理解应该是这样的:2015-05-17T18:49:11-07:00(我住在南加州,通常是 UTC-08:00但由于夏令时,现在是 UTC-07:00)无论如何,在我自己的测试中,我的应用正在生成如下 URL:

https://www.googleapis.com/calendar/v3/calendars/CALENDAR_IDENTIFIER/events?orderBy=startTime&q=Live&singleEvents=true&timeMin=2015-05-17T18:49:11-07:00&timeMax=2015-06-16T18:49:11-07:00&key=API_KEY

这些都运行良好,它们返回了预期的日历数据。

但是我最近刚刚添加了一位居住在新西兰的测试人员,他的时间是 UTC+12:00。他的应用正在生成这样的 URL:

https://www.googleapis.com/calendar/v3/calendars/CALENDAR_IDENTIFIER/events?orderBy=startTime&q=Live&singleEvents=true&timeMin=2015-05-17T13:49:11+12:00&timeMax=2015-06-16T13:49:11+12:00&key=API_KEY

但是对他来说,他们没有工作,他们从谷歌返回“400 Bad Request”错误。

我做了一些实验,在我的发现中,我尝试的任何负 UTC 偏移都可以正常工作(例如夏威夷,UTC-11:00,安克雷奇,UTC-09:00)但是没有正 GMT 偏移工作(新西兰@UTC+12:00,日本@UTC+09:00)

我做错了什么?

编辑:我现在已经解决了这个问题,将我所有的时间转换为 UTC 并将它们指定为例如2015-05-17T18:49:11Z,然后添加timeZone=America/Los_Angeles(或Asia/Tokyo或无论用户在哪里)到 API 调用。谷歌似乎接受了这一点。我仍然想知道为什么,即使他们声称接受了 ISO 8601 格式字符串,但实际上并没有(考虑到 Google 的回复,即我的应用收到的实际日历数据,这尤其奇怪/令人费解/令人沮丧,实际上,实际上包含带有正偏移量的 ISO 8601 日期字符串,例如2015-06-15T09:00:00+09:00。)

【问题讨论】:

  • 我也刚刚发现了这个错误 - 最终在 PHP 中使用 str_replace('+','-', date(DateTime::ATOM)); 表示 GMT / UTC (+00:00)
  • 遇到了同样的问题,WTF google ??
  • 也许这个答案可以帮助你:*.com/a/42437351/5754223

标签: date datetime calendar google-calendar-api utc


【解决方案1】:

是的,这似乎是一个错误。我在西班牙(UTC + 01:00),考虑到响应数据如您所说的那样格式化为正偏移量,我对此感到很疯狂。

我将它用于 http 请求中的 timeMin 参数以仅获取未来事件。最终将当前日期时间添加为最后一个“Z”作为字符串。显然工作正常,但我在日历定义的同一时区。如果不是这种情况,我想如果你想要小时进动的话你会遇到问题。

timeZone 参数显然只用于响应数据。

【讨论】:

    【解决方案2】:

    如果+ 被编码为%2B,它就可以工作。

    【讨论】:

      最近更新 更多