Как я могу контролировать TimeZone событий, возвращаемых .NET Google Calendar API? - PullRequest
0 голосов
/ 28 октября 2010

У меня есть следующий код для использования на моем сайте asp.net:

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Не борись с этим. Библиотека Google.GData.Calendar каждый раз устанавливает местное время системы. Вот что я мог откопать об этом .

Вам нужно будет конвертировать все эти времена из каждого 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;

    }        
0 голосов
/ 29 октября 2010

Я все еще открыт для других идей, но вот что я получил, чтобы работать.Я создал свой собственный класс 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...