Google calendar api 谷歌日历API v3时区问题
为Google日历API使用.Net API包装器Google calendar api 谷歌日历API v3时区问题,google-calendar-api,Google Calendar Api,为Google日历API使用.Net API包装器 首先获取主日历id 获取主日历的时区(返回良好数据,例如“America/Los_Angeles”) 创建日历事件。设置开始时间和结束时间。设定时区 但事件是在凌晨3点创建的,此时指定的开始时间是上午11点 Google API文档说明“除非在时区中明确指定了时区,否则需要时区偏移量”,对于时区,“指定时间的时区。(格式为IANA时区数据库名称,例如“Europe/Zurich”。) 正在正确指定时区值 基本上,是否指定时区没有任何区别。事件是
event.Start
和event.End
会自动转换日期并在末尾添加一个“Z”。这告诉谷歌日期是GMT格式的。没有理由加上“Z”,因为即使没有它,谷歌也会考虑GMT。所以基本上,event.TimeZone=value
被忽略了,因为时间被加上了“Z”
在我去掉“Z”之后,一切都正常
entry.Start.DateTimeRaw = replace(entry.Start.DateTimeRaw,"Z","")
entry.End.DateTimeRaw = replace(entry.End.DateTimeRaw,"Z","")
我通过创建一个DateTime对象的实例来修复它,该对象使用
DateTimeKind
enum作为构造函数之一。反序列化JSON日期时,我发现默认的DateTime.Kind
属性值是DateTimeKind.Utc
。这就是为什么Z(UTC)值对我来说是原始值。将DateTimeKind.Local应用于接受它的某个构造函数中的DateTimeKind参数时,时区值将是正确的
DateTime dt = new DateTime(oldDateTime.Ticks, DateTimeKind.Local);
DateTime dt = new DateTime(yearVar, monthVar, dayVar, hourVar, minuteVar, secondVar, DateTimeKind.Local);
与其设置作为
Start
和End
对象一部分的Datetime
属性,不如为DateTimeRaw
指定一个值,并为其指定一个时区,如下所示:
eventItem.Start = new EventDateTime()
{
DateTimeRaw = input.Start.ToString("yyyy-MM-ddTHH:mm:ss"),
TimeZone = "America/New_York"
};
注意,我没有在字符串格式的末尾添加Z或任何时区表示。这将解决问题,并防止谷歌在您设置值时忽略timezone属性
此外,如果将鼠标悬停在Visual Studio中的开始
或结束
对象的日期时间
属性上,则其描述如下:EventDateTime.DateTimeRaw的日期时间表示形式
(请参见图)
在这种情况下,将
Z
值替换为空字符串只会使问题变得更糟,因为DateTime
属性也将更新。我希望这对将来的任何人都有帮助 这是一个老问题,但我认为在将日历ID添加到条目后,时区和DST不是问题。因此,首先获取默认日历ID或用户所选日历的日历ID,并在设置calendar events.hi时使用该日历ID。我也有同样的问题。但是使用本地类似乎不会对日历UI造成影响。raw现在看起来确实发生了变化,但浏览器显示的时间不正确。谢谢如果我知道用户的谷歌日历的时区,我就没有办法获取它,这太糟糕了。但是,因为我的逻辑在尝试插入事件之前就获取事件,所以时区是返回的事件对象元数据的一部分。
eventItem.Start = new EventDateTime()
{
DateTimeRaw = input.Start.ToString("yyyy-MM-ddTHH:mm:ss"),
TimeZone = "America/New_York"
};