2010-10-27 6 views
0

У меня есть следующий код для использования на моем сайте asp.net:Как управлять часовым поясом событий, возвращаемых API Google Calendar Google?

CalendarService service = new CalendarService("mycalendar"); 
EventQuery query = new EventQuery(); 
query.Uri = new Uri(group.GroupEventsURL); 
query.SingleEvents = true; 
query.SortOrder = CalendarSortOrder.ascending; 
query.ExtraParameters = "orderby=starttime"; 
query.NumberToRetrieve = 50; 
query.TimeZone = "America/Chicago"; 
EventFeed feed = service.Query(query); 

Который производит следующий URL:

http://www.google.com/calendar/feeds/TRIMMEDgroup.calendar.google.com/private-TRIMMED/full?max-results=50&orderby=starttime&ctz=America%2FChicago&sortorder=ascending&singleevents=true

Согласно documentation (курсив мой), я ожидаю, Времена в каждом EventEntry быть в Центральном часовом поясе:

ctz: Текущий часовой пояс. Если не указано, время возвращается в часовой пояс календаря.

  • Времена в результате подачи будут представлены в этом часовом поясе.
  • Заменить все пробелы символами подчеркивания (например, «ctz = America/Los_Angeles»).

Но мой сервер размещен в Аризоне, так что (сейчас) все даты в календаре два часа раньше, чем они должны быть. Я делаю что-то неправильно? Как получить даты в фиде в Центральном часовом поясе, даже если сервер находится в Аризоне?

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

ответ

0

Я по-прежнему открыт для других идей, но вот что я должен работать. Я создал свой собственный CalendarService класс, который преобразует даты от:

2010-10-13T18: 30: 00.000-05: 00

к:

2010-10- 13 18:30:00

Эти даты затем преобразуются в то же (и правильно) DateTime в любой часовой пояс.

internal class CalendarService2 : CalendarService 
{ 
    public CalendarService2(string applicationName) : base(applicationName) { } 

    public new EventFeed Query(EventQuery feedQuery) 
    { 
     EventFeed feed = new EventFeed(feedQuery.Uri, this); 
     using (Stream input = base.Query(feedQuery.Uri, DateTime.MinValue)) 
     { 
      XmlDocument doc = new XmlDocument(); 
      doc.Load(input); 
      XmlNodeList nodes = doc.SelectNodes("(//@startTime|//@endTime)[contains(.,'.000-')]"); 
      foreach (XmlNode node in nodes) 
      { 
       node.Value = node.Value.Remove(node.Value.Length - 10).Replace('T', ' '); 
      } 
      using (MemoryStream output = new MemoryStream()) 
      { 
       doc.Save(output); 
       output.Position = 0; 
       feed.NewAtomEntry += new FeedParserEventHandler(this.OnParsedNewEntry); 
       feed.NewExtensionElement += new ExtensionElementEventHandler(this.OnNewExtensionElement); 
       feed.Parse(output, AlternativeFormat.Atom); 
      } 
     } 
     return feed; 
    } 
} 
1

Не боритесь с ним. Библиотека Google.GData.Calendar устанавливается каждый раз в локальное время системы. Here's what I could dig up about it.

Вам нужно преобразовать все те времена, от каждого EventEntry

DateTime offsetStartTime = GetTimeZoneOffset(entry.Times[0].StartTime, "Mountain Standard Time"); 

    public static DateTime GetTimeZoneOffset(DateTime dt, string win32Id) 
    { 
     var timeUtc = dt.ToUniversalTime(); 
     TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById(win32Id); 
     DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, cstZone); 
     return cstTime; 

    }