API Google Calendar. Сортировка событий по дате - PullRequest
3 голосов
/ 26 июня 2009

Я уже несколько дней читаю документы и играю с разными параметрами EventQuery. Я использую C # .NET с google .net api для получения событий из общего календаря, который я настроил. Я могу получить события из API просто отлично, но я не могу получить его, чтобы дать мне следующие предстоящие события по дате. Мой календарь смешал повторяющиеся события с одноразовыми событиями. Я прочитал материал в Интернете, чтобы использовать строки параметров прямого запроса в URI запроса, но, похоже, не работает должным образом при использовании его в структуре API .net. Вот то, что я сейчас использую в качестве своей базы:

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, чтобы я мог сам отсортировать его и отформатировать с заголовком в моем элементе управления, но единственное место, где я вижу это, находится в Content.Content AtomEntry. у которого также есть другие вещи, которые я действительно не хочу. Для этого есть член DateTime в AtomEntry, чтобы я мог просто получить дату?

Это действительно запутало меня сейчас, поэтому любая помощь приветствуется.

Ответы [ 7 ]

4 голосов
/ 21 августа 2009
 myQuery.ExtraParameters = "orderby=starttime&sortorder=ascending";

Работает как шарм!

4 голосов
/ 26 июня 2009

Я не использовал API календаря GData из .NET, но я довольно хорошо знаком с ним в Java. Время начала события будет зависеть от типа события. Повторяющееся событие не имеет времени начала как такового, но «одиночное» событие может фактически иметь несколько раз. Они хранятся в виде <gd:when> элементов - это то, что вам нужно искать.

Похоже, что orderby=starttime на самом деле должно работать, хотя. Может быть, стоит использовать WireShark или что-то подобное, чтобы увидеть точный запрос и точные результаты, чтобы убедиться, что это не то, что в API вызывает проблемы - в частности, может случиться так, что использование этого в свойстве Uri не поддерживается по некоторым причинам ...

РЕДАКТИРОВАТЬ: Вы пытались установить

query.ExtraParameters = "orderby=starttime";

? Это, пожалуй, самый безопасный способ вставить его в окончательный запрос URI ...

1 голос
/ 06 декабря 2011

Возможно, уже поздно для OP, но я нашел это свойство, которое сортирует результат. Может, кому-то это поможет;)

var query = new EventQuery(FEED_URL);    
query.SortOrder = CalendarSortOrder.ascending;
0 голосов
/ 13 октября 2011

Вы также можете убедиться, что вы не получаете отмененное событие, с которым вы можете столкнуться, если вы удалите только первое вхождение повторяющегося события, а затем удалите оставшиеся события в последовательности. Эти оставшиеся события в последовательности, которую вы удалили, фактически не были удалены, скорее, их статус был установлен для отмены за кулисами.

Единственный способ не читать эти события в вашем коде - это проверить свойство Status в EventEntry.

0 голосов
/ 19 декабря 2010
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;
    }
}

работал для меня.

0 голосов
/ 30 сентября 2009

Чтобы получить дату, я сделал что-то подобное с запросом 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.

0 голосов
/ 26 июня 2009

Это было в Документах Google для 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);

Подробнее об этом можно прочитать здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...