代码之家  ›  专栏  ›  技术社区  ›  Erik

.NET Google日历API按日期对事件排序

  •  3
  • Erik  · 技术社区  · 16 年前

    我已经阅读文档并使用不同的eventquery参数玩了好几天了。我正在使用C.NET和Google的.NET API从我设置的公共日历中获取活动。我可以很好地从API中获取事件,但是我不能按日期给我下一个即将发生的事件。我的日历将重复事件和一次性事件混合在一起。我在互联网上读过一些东西,可以在请求URI中使用直接查询参数字符串,但在.NET API结构中使用它时,似乎效果不太好。以下是我目前的基础:

    CalendarService myService = new CalendarService("testGoogleCalendar-1");
    EventQuery myQuery = new EventQuery();
    myQuery.Uri = new Uri(CalendarURI);
    myQuery.NumberToRetrieve = NumberOfEvents;
    EventFeed calFeed = myService.Query(myQuery);
    foreach (AtomEntry entry in calFeed.Entries)
    {
        LiteralControl test = new LiteralControl("<p><b>" + entry.Title.Text + "</b></p>");
        this.Controls.Add(test);
    }            
    

    我尝试过使用EventQuery的成员StartDate、StartTime、EndTime、SortOrder、FutureEvents,甚至尝试添加“?orderby=starttime“,指向calendaruri本地成员。

    API查询似乎返回事件的发布日期顺序,即我在日历中创建事件的时间,而不是事件将要发生的时间。

    我还试图从Atomentry对象中获取事件的日期和时间,这样我就可以自己对其进行排序,并用控件中的标题对其进行格式化,但我唯一能看到的地方是Atomentry的内容。内容中还包含我不真正想要的其他内容。Atomentry是否有一个datetime成员,以便我只获取日期?

    这一次我真的很困惑,所以任何帮助都是感激的。

    7 回复  |  直到 11 年前
        1
  •  4
  •   Jon Skeet    16 年前

    我还没有从.NET中使用GDATA日历API,但我对Java非常熟悉。事件的开始时间将取决于事件的类型。重复性事件没有任何开始时间,但是“单个”事件实际上可能有多次。这些存储为 <gd:when> 元素-这就是你需要寻找的。

    看起来确实像 orderby=starttime 真的? 应该 尽管工作。可能值得使用wireshark或类似的工具来查看确切的查询和返回的确切结果,以检查它是否在API中引起问题-特别是,可能由于某种原因不支持在uri属性中使用它…

    编辑:您尝试过设置吗

    query.ExtraParameters = "orderby=starttime";
    

    ?这可能是将其放入最终查询URI的最安全方法…

        2
  •  4
  •   Vignesh Kumar A    11 年前
     myQuery.ExtraParameters = "orderby=starttime&sortorder=ascending";
    

    真是魅力四射!

        3
  •  1
  •   JiBéDoublevé    14 年前

    手术可能晚了,但我发现这个属性对结果进行了排序。可能对某些人有帮助;)

    var query = new EventQuery(FEED_URL);    
    query.SortOrder = CalendarSortOrder.ascending;
    
        4
  •  0
  •   Kredns    16 年前

    这是Google Doc的日历API:

    EventQuery myQuery = new EventQuery(feedUrl);
    myQuery.StartTime = new DateTime(2007, 1, 5);
    myQuery.EndTime = new DateTime(2007, 1, 7);
    
    EventFeed myResultsFeed = myService.Query(myQuery);
    

    你可以多读一些 here .

        5
  •  0
  •   ike    15 年前
    EventQuery query = new EventQuery();
    query.Uri = new Uri("https://www.google.com/calendar/feeds/" + this.Service.Credentials.Username + "/private/full");
    query.ExtraParameters = "orderby=starttime&sortorder=ascending";
    query.SingleEvents = true;
    query.StartTime = DateTime.Now;
    query.EndTime = DateTime.Now.AddDays(7.0);
    
    EventFeed calFeed = this.Service.Query(query);
    
    List<SyndicationItem> items = new List<SyndicationItem>();
    foreach (var entry in calFeed.Entries)
    {
       EventEntry eventEntry = entry as Google.GData.Calendar.EventEntry;
       if (eventEntry != null)
       {
          if (eventEntry.Times.Count != 0)
          {
             DateTime dt = eventEntry.Times[0].StartTime;
        }
    }
    

    为我工作。

        6
  •  0
  •   takrl cck    14 年前

    为了得到日期,我用LINQ查询做了类似的事情。

    public static IEnumerable<EventDto> FindTopEvent(this AtomEntryCollection items, int cnt)
    {
        return (from  item in items.OfType<EventEntry>()
                select new EventDto
                {
                    Url = item.FeedUri,
                    Title = item.Title.Text,
                    Date = item.Times[0].StartTime.ToShortDateString()
                }).Take(cnt);
    }
    

    如果您有经常性事件,您可能需要考虑这样做:

    Date = (item.Times.Count > 0) ? item.Times[0].StartTime.ToShortDateString() : ""
    

    另外,设置 SingleEvent 属性对 EventQuery true 会有帮助的。

        7
  •  0
  •   Muthu Kumaran    13 年前

    您可能还希望确保没有收到取消的事件,如果只删除重复事件的第一个事件,然后按顺序删除其余事件,则可能会遇到这种情况。您删除的序列中的这些剩余事件实际上没有被删除,相反,它们的状态被设置为“在幕后取消”。

    在代码中不读取这些事件的唯一方法是检查EventEntry的状态属性。