为Google Calendar API使用.Net API包装。
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格式创建。 这有什么不对?
答案 0 :(得分:4)
修正了它(或者让我们说它被黑了)。谷歌.Net API包装器绝对是垃圾(这包括所有API的包装,而不仅仅是Calendar API)。
问题在于event.Start
和event.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
的值,并为其分配时区,而不是设置Start
和End
对象的DateTimeRaw
属性:
eventItem.Start = new EventDateTime()
{
DateTimeRaw = input.Start.ToString("yyyy-MM-ddTHH:mm:ss"),
TimeZone = "America/New_York"
};
注意到我没有在字符串格式的末尾添加Z或任何时区表示。这样应该可以解决问题,并可以防止Google在设置值时忽略timezone属性。
此外,如果将鼠标悬停在Visual Studio中DateTime
或Start
对象的End
属性上,它的描述如下:DateTime representation of EventDateTime.DateTimeRaw
(参见图片)。
在这种情况下,将Z
值替换为空字符串只会使问题变得更糟,因为您的DateTime
属性也会被更新。我希望这对以后的任何人都有帮助。