【问题标题】:How to use Google Calendar API's Events.Insert command properly?如何正确使用 Google Calendar API 的 Events.Insert 命令?
【发布时间】:2012-06-05 04:08:19
【问题描述】:

所以我一直在使用调用 Google API 的 REST 方法。我需要将事件插入到我拥有其 ID 的特定日历中。这是我发送的 POST 请求:

地址: https://www.googleapis.com/calendar/v3/calendars/{calendarID}/events

主体:

Authorization:  Bearer {access_token}
{
 "end": {
  "dateTime": "2012-08-30T12:30:00",
  "timeZone": "America/Chicago"
 },
 "start": {
  "dateTime": "2012-08-30T14:00:00",
  "timeZone": "America/Chicago"
 },
 "summary": "E E 306",
 "colorId": "9"
 "kind": "calendar#event"
}

这是我不断得到的回应:

{
 "error":{
  "errors":[
   {
    "domain":"calendar",
    "reason":"timeRangeEmpty",
    "message":"The specified time range is empty.",
    "locationType":"parameter",
    "location":"timeMax"
   }
  ],
  "code":400,
  "message":"The specified time range is empty."
 }
}

我不明白我可能做错了什么。我已经输入了所有必要的数据,它要求我提供一个事件甚至不存在的参数。我也找不到关于这个特定问题的任何文档。有人看到我遗漏的东西吗?

【问题讨论】:

  • 仅供参考,您可能想编辑您的访问令牌,并尽量避免将来公开它。即使它们在一小时后过期,也有人可以在它仍然有效的情况下使用该令牌读取并可能写入您的日历。
  • 糟糕,我想这是真的。这些东西还能持续多久?

标签: java google-api google-calendar-api


【解决方案1】:

在问这个问题的过程中,我的脸被狠狠地拍了一下,我想我已经给自己造成了脑损伤。事实证明,我找不到有关此问题的任何文档的原因是因为它非常愚蠢。

它给我这样一个有趣的错误的原因是因为在我进行测试的复制粘贴中,我颠倒了开始和结束时间。所以,我告诉 Google 日历输入一个在开始之前就结束的活动,这通常不会很好地结束。

长话短说,如果您在尝试插入事件时遇到涉及“timeMax”参数的错误,请检查您的开始和结束时间。

【讨论】:

  • 我也犯了类似的错误。谢谢你的解释。
  • 这里也一样哈哈哈。这解决了它。 SO中有足够的空间来解决愚蠢的问题。他们确实需要更好的错误消息,例如:“开始日期不能晚于结束日期。”
  • Google 仍应改进错误消息,如果您在插入新事件之前使用 timeMin timeMax 检索事件,可能会造成混淆。
  • 基本上,“Startdate/StartDateTime”应该总是在“Enddate/EnddateTime”之前
【解决方案2】:

dateTimes 必须在 RFC3339 上,如下所述:

https://developers.google.com/google-apps/calendar/v3/reference/events

【讨论】:

    【解决方案3】:
    {
     "end": {
      "dateTime": "2014-04-01T10:00:00-06:00"
     },
     "start": {
      "dateTime": "2014-04-02T10:00:00-06:00"
     }
    

    【讨论】:

      【解决方案4】:

      比较开始和结束日期时间,开始总是小于结束。还将 dateTime 格式更改为“2018-03-07T18:00:00+05:30”。

      在IOS中,我使用

      这个日期时间格式的代码:

      let dateTimeFormatter = DateFormatter()
      dateTimeFormatter = Locale(identifier: "en_US_POSIX")
      dateTimeFormatter = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
      dateTimeFormatter = TimeZone(secondsFromGMT: 0)
      let dateTimeString = dateTimeFormatter.string(from: YOUR_DATE_TIME)
      

      日期格式的代码:

      let dateFormatter = DateFormatter()
      dateFormatter.dateFormat = "yyyy-MM-dd"
      let dateString = dateFormatter.string(from: YOUR_DATE)
      

      一个键和它的值就足够了,剩下的两个键不需要,即你有'dateTime'键有值,那么不需要'date'和'timeZone'键。如果你想设置'timeZone',它是可选的,但只有'date'和'dateTime'中的一个就足够了。

      【讨论】:

        【解决方案5】:

        这个问题大多在start > end

        时遇到

        示例:您指定的开始和结束日期如下:

        开始:2020-10-10T13:30:00+5:30(即 2020 年 10 月 10 日 @1:30PM) 结束:2020-10-10T13:00:00+5:30(即 2020 年 10 月 10 日 @1:00PM)

        结束时间应该大于开始时间。

        {
        "summary": "some summary",
        "description": "some description",
        "location": "some location",
        "end":  {"dateTime" : "2020-10-10T13:30:00+5:30"},
        "start" : { "dateTime" : "2020-10-10T13:00:00+5:30"},
        }
        

        【讨论】:

          猜你喜欢
          • 2015-02-03
          • 1970-01-01
          • 2017-03-21
          • 1970-01-01
          • 2021-10-03
          • 2014-11-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多