使用C#添加Google日历活动时出现时差问题

时间:2013-05-08 07:37:04

标签: c# timezone google-calendar-api gdata-api

我使用“Google.GData.Calendar”API使用c#将事件添加到Google日历。但是在我的数据库和Google日历中创建的事件之间存在时间差异。

以下是使用Google.GData API向Google日历添加活动的代码:

public static void AddEventToGoogle()
{
    //string timezone = "US Mountain Standard Time";

    Uri postUri = new Uri("https://www.google.com/calendar/feeds/default/private/full");
    try
    {
        GOAuthRequestFactory authFactory = new GOAuthRequestFactory("cl", "MyApp");
        authFactory.ConsumerKey =  ConfigurationManager.AppSettings["GConsumerKey"].ToString();
        authFactory.ConsumerSecret =  ConfigurationManager.AppSettings["GConsumerKeySecret"].ToString();
        authFactory.Token = "xxxxxxxxxx";
        authFactory.TokenSecret = "xxxxxx";
        Google.GData.Calendar.CalendarService service = new Google.GData.Calendar.CalendarService(authFactory.ApplicationName);
        service.RequestFactory = authFactory;

        EventEntry entry = new EventEntry();
        entry.Title.Text = "Test Google Event Create";
        entry.Content.Content = "Test Google Event Create";
        entry.Notifications = false;

        When eventTime = new When();
        eventTime.AllDay = false;
        eventTime.StartTime = new DateTime(2013, 5, 9, 8, 0, 0);
        eventTime.EndTime = new DateTime(2013, 5, 9, 11, 0, 0);
        entry.Times.Add(eventTime);

        // Send the request and receive the response:
        EventEntry insertedEntry = service.Insert(postUri, entry);
        if (insertedEntry != null && !string.IsNullOrEmpty(insertedEntry.EventId))
        {
            //Get the insertedEntry.EventId
        }
    }
    catch (GDataRequestException gre)
    {
        HttpWebResponse response = (HttpWebResponse)gre.Response;
    }
}

但是上面的代码与我打算创建的事件和Google日历中的条目存在时差。我在谷歌日历中的TimeZone是“(格林威治标准时间-07:00)山地时间 - 亚利桑那州”。当我将Google日历的时区更改为CST,PST,...时,就会发生这种情况。

请为此情况建议解决方法,或在向Google日历添加活动时指定TimeZone。

使用我用来添加活动的完整方法更新了我的问题

1 个答案:

答案 0 :(得分:0)

GData库使用了Google API的v2。我认为您需要将代码迁移到v3才能获得对事件时区的适当支持。

例如,请参阅this page,其中显示了创建定期事件的示例。 (切换到“.NET”选项卡“。

以下是一些可以帮助您的资源:

我确实查看了您的代码和v2 GData库的参考指南。我只在CalendarEntryEventFeedEventQuery类上看到TimeZone属性。由于你没有使用任何这些,我认为在v2中不可能。

<强>更新

v2 API中的可能。您可以在ICAL格式的<gd:recurrence>标记中传递时区。请查看this documentation中示例后面的注释。

但是,它似乎不会作为.Net GData客户端库中EventEntry类的属性公开。所以我的推荐是 - 使用v3 api和客户端库。