代码之家  ›  专栏  ›  技术社区  ›  Rich Bennema

如何控制.NET Google日历API返回的事件的时区?

  •  0
  • Rich Bennema  · 技术社区  · 15 年前

    我有以下代码可在我的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

    根据 documentation (强调我的),我希望每个事件入口的时间都在中央时区:

    当前时区。如果未指定,则在日历时区中返回时间。

    • 结果提要中的时间将在此时区中表示 .
    • 用下划线替换所有空格(例如“ctz=America/Los_Angeles”)。

    但我的服务器是在亚利桑那州托管的,所以(目前)日历上的所有日期都比应该的早两个小时。我做错什么了吗?如何使feed中的日期位于中央时区,即使服务器位于亚利桑那州?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Berin Iwlew    14 年前

    别反抗。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;
    
        }        
    
        2
  •  0
  •   Rich Bennema    15 年前

    CalendarService 类,它将日期转换为:

    致:

    2010年10月13日18:30:00

    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;
        }
    }
    
    推荐文章