首页 > 解决方案 > 防止 Google Calendar API V3 更改事件时间 C#

问题描述

我真的遇到了一些时区问题,并且没有遇到其他类似问题。

基本上我想在两个人之间创建和共享一个谷歌日历事件,但我希望我为开始/结束提供的日期时间与他们中的任何一个人完全一致并且不转换。我在 UTC-5 中,当我测试事件时,我在过去 5 小时收到它们,即使我将时区设置为 UTC,从日期中删除“Z”,并将 DateTimeKind 设置为本地.. .

我尝试过的事情:

DateTimeRaw = DateTime.ParseExact(appointment.Start.ToString("MM/dd/yyyy HH:mm"), "MM/dd/yyyy HH:mm", CultureInfo.InvariantCulture).ToString("yyyy-MM-ddTHH:mm:ss").Replace("Z", "")

然后将上述内容添加到约会中,但将 .ToUniversalTime() 添加到约会中

DateTime = new DateTime(appointment.Start.Year, appointment.Start.Month, ....)

并且...

DateTime.SpecifyKind(DateTime.ParseExact(appointment.Start.ToString("MM/dd/yyyy HH:mm"), "MM/dd/yyyy HH:mm", CultureInfo.InvariantCulture), DateTimeKind.Local)

我还用 DateTimeKind.UTC 尝试了上述方法

我基本上一直在尝试大量组合,然后决定停止,因为我真的不知道为什么它不起作用......

是否可以为 Google 日历中的所有用户保留完全相同的时间?在此之前我使用了 ICAL.NET 库并制作了我自己的 .ics 事件并且它运行良好,但是 GCal 的相同 DateTime 代码似乎无法按预期工作。

编辑:

关于我正在尝试做的事情的推理的更多背景。我正在开发一个处理面对面约会的 SaaS 调度应用程序,但我们不知道具体位置在哪里。我们解决这个问题的方法是,在 UI 和存储的值中,每个约会都是 UTC,所以他们看到下午 5 点,选择下午 5 点,存储为下午 5 点,最终应该作为下午 5 点的 Google 日历事件共享。如果用户在不同的时区,它仍然会显示下午 5 点(因为一切都是 UTC),但期望他们将在实际约会的预定位置的时区中。

我们正在从发送 .ics 附件和 Google 日历的开始/结束中断的相同代码切换到 Google 日历。

标签: c#datetimetimezonegoogle-calendar-api

解决方案


谷歌日历

创建日历事件时,默认情况下会在当前时区创建它。

如果您希望多个用户同时拥有相同的事件,您只需要确保每个用户的日历设置都在正确的时区上

如果您想在不属于您自己的另一个时区创建事件,您可以向 API 指定时区

指定时间的时区。(格式化为 IANA 时区数据库名称,例如“Europe/Zurich”。)对于重复事件,此字段是必需的,并指定扩展重复发生的时区。对于单个事件,此字段是可选的,并指示事件开始/结束的自定义时区。

编辑

如果您正在创建自己的日程安排应用程序并希望在 Google 日历上显示这些事件,您可以嵌入具有特定时区的日历。

但是,如果您正在与可能具有不同时区的多个用户打交道,那么考虑这一点很重要。您的应用程序设计在这方面存在缺陷,不支持这些用例。

您提到您正在销售一个调度 SaaS 应用程序,所以我将使用它来生成一个商业案例来证明我的想法:

想象一下,您的班级有 1 位教授(在美国)、1 位学生(也在美国)和另外 2 位来自日本的学生。

教授将安排在当地时间下午 1 点上课。

由于课程是在线的,所有学生都需要在那个时候有空,无论他们的时区如何。

如果我想在每个人的日历中添加一个事件,我不会在每个日历上标记下午 1 点。我将在用户的时区标记等效时间。


推荐阅读