Google Calendar API v3时区问题

时间:2015-02-14 19:18:28

标签: google-calendar-api

为Google Calendar API使用.Net API包装。

  1. 首先获取主日历ID
  2. 获取主日历的时区(返回好的数据,例如" America / Los_Angeles")
  3. 创建日历活动。设置开始时间和结束时间。设置时区。
  4. Dim eStart As New EventDateTime
    eStart.DateTime = _startAt
    eStart.TimeZone = GoogleTimeZone
    Dim eEnd As New EventDateTime
    eEnd.DateTime = _endAt
    entry.Start = eStart
    entry.End = eEnd
    eEnd.TimeZone = GoogleTimeZone
    CalService.Events.Insert(entry, calendarid).Execute()
    

    但是当指定的开始时间是上午11点时,事件将在凌晨3点创建。

    Google API文档声明"除非在timeZone"中明确指定时区,否则需要时区偏移。对于时区"指定时间的时区。 (格式化为IANA时区数据库名称,例如" Europe / Zurich"。)"。

    正确指定时区值。

    基本上,无论是否指定时区,都没有任何区别。活动在Google日历中以GMT格式创建。 这有什么不对?

3 个答案:

答案 0 :(得分:4)

修正了它(或者让我们说它被黑了)。谷歌.Net API包装器绝对是垃圾(这包括所有API的包装,而不仅仅是Calendar API)。

问题在于event.Startevent.End会自动转换日期并添加" Z"在末尾。这告诉Google,日期是GMT格式。没有理由把'" Z"因为即使没有它,Google也会考虑GMT。所以基本上,event.TimeZone=value被忽视了,因为时间附加了" Z"。

我删除" Z"后,一切正常。

entry.Start.DateTimeRaw = replace(entry.Start.DateTimeRaw,"Z","")
entry.End.DateTimeRaw = replace(entry.End.DateTimeRaw,"Z","")

答案 1 :(得分:1)

我通过创建一个DateTime对象的实例来修复它,该对象使用DateTimeKind枚举作为构造函数之一。在反序列化JSON日期时,我发现默认的DateTime.Kind属性值为DateTimeKind.Utc。这就是为什么Z(UTC)值在Raw中的原因。当DateTimeKind.Local应用于其中一个构造函数中的DateTimeKind参数时,时区值将是正确的。

DateTime dt = new DateTime(oldDateTime.Ticks, DateTimeKind.Local);
DateTime dt = new DateTime(yearVar, monthVar, dayVar, hourVar, minuteVar, secondVar, DateTimeKind.Local);

答案 2 :(得分:0)

应该设置Datetime的值,并为其分配时区,而不是设置StartEnd对象的DateTimeRaw属性:

     eventItem.Start = new EventDateTime()
     {
         DateTimeRaw = input.Start.ToString("yyyy-MM-ddTHH:mm:ss"),
         TimeZone = "America/New_York"
     };

注意到我没有在字符串格式的末尾添加Z或任何时区表示。这样应该可以解决问题,并可以防止Google在设置值时忽略timezone属性。

此外,如果将鼠标悬停在Visual Studio中DateTimeStart对象的End属性上,它的描述如下:DateTime representation of EventDateTime.DateTimeRaw(参见图片)。

enter image description here

在这种情况下,将Z值替换为空字符串只会使问题变得更糟,因为您的DateTime属性也会被更新。我希望这对以后的任何人都有帮助。