Google calendar api 谷歌日历API v3时区问题

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”。) 正在正确指定时区值 基本上,是否指定时区没有任何区别。事件是

为Google日历API使用.Net API包装器

  • 首先获取主日历id
  • 获取主日历的时区(返回良好数据,例如“America/Los_Angeles”)
  • 创建日历事件。设置开始时间和结束时间。设定时区
  • 但事件是在凌晨3点创建的,此时指定的开始时间是上午11点

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

    正在正确指定时区值

    基本上,是否指定时区没有任何区别。事件是在谷歌日历的GMT中创建的。 这里出了什么问题?

    修复了它(或者说被黑客攻击了)。Google.NETAPI包装器绝对是垃圾(这是他们所有API的包装器,而不仅仅是日历API)

    问题是
    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"
         };