使用Google API创建的定期年度约会

时间:2016-10-10 20:49:14

标签: c# google-api google-calendar-api google-api-dotnet-client

我正在开发用于在Google和Outlook之间同步日历的开源应用。一些用户报告了几年前开始日期的定期约会的一些奇怪行为。下面是示例代码,所有断言都在传递。我的问题是为什么从1970-10-14T08:00:00.000Z小时的预约由API转移到09:00:00 + 01:00如果我将开始日期转移到2000年它将转移到10:00:00 +02:00?当我检查两个事件在Google中的外观时,他们会在不同的时间开始,而且我认为应该在相同的时间开始(因为只有年份已经更改)

var e1 = new Google.Apis.Calendar.v3.Data.Event();
e1.Summary = "Birthday1";
e1.Start = new EventDateTime();
e1.End = new EventDateTime();
e1.Start.DateTime = new DateTime(1970, 10, 14, 10, 0, 0);
e1.End.DateTime = new DateTime(1970, 10, 14, 11, 0, 0);
e1.Start.TimeZone = "Europe/Warsaw";
e1.End.TimeZone = "Europe/Warsaw";
e1.Recurrence = new List<String>();
e1.Recurrence.Add("RRULE:FREQ=YEARLY;BYMONTHDAY=14;BYMONTH=10");

Assert.AreEqual("1970-10-14T08:00:00.000Z", e1.Start.DateTimeRaw);
var c1 = service.Insert(e1, primaryCalendar.Id).Execute();
Assert.AreEqual("1970-10-14T09:00:00+01:00", c1.Start.DateTimeRaw); // 09:00:00+01:00 

var e2 = new Google.Apis.Calendar.v3.Data.Event();
e2.Summary = "Birthday2";
e2.Start = new EventDateTime();
e2.End = new EventDateTime();
e2.Start.DateTime = new DateTime(2000, 10, 14, 10, 0, 0);
e2.End.DateTime = new DateTime(2000, 10, 14, 11, 0, 0);
e2.Start.TimeZone = "Europe/Warsaw";
e2.End.TimeZone = "Europe/Warsaw";
e2.Recurrence = new List<String>();
e2.Recurrence.Add("RRULE:FREQ=YEARLY;BYMONTHDAY=14;BYMONTH=10");

Assert.AreEqual("2000-10-14T08:00:00.000Z", e2.Start.DateTimeRaw);
var c2 = service.Insert(e2, primaryCalendar.Id).Execute();
Assert.AreEqual("2000-10-14T10:00:00+02:00", c2.Start.DateTimeRaw); //10:00:00+02:00

我想知道我需要做些什么才能将旧的经常性约会正确地保存到Google?我应该有一些独立的逻辑,这取决于一年吗?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

基于此documentation,其起始和结束字段必须定义第一个匹配项,其重复字段定义事件应如何重复。

您可以根据文档尝试此sample。在这里,我从2016年10月14日上午10点到11点创建了一个活动。它将按规则中的规定每年重复一次。如果只在规则中添加$(div).load,则只会停止。

UNTIL=[yearmmdd]

您还可以查看此documentation以获取更多样本。