首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何控制由TimeZone返回的事件的TimeZone?

如何控制由TimeZone返回的事件的TimeZone?
EN

Stack Overflow用户
提问于 2010-10-27 22:50:54
回答 2查看 1.9K关注 0票数 0

我有以下代码可用于我的asp.net网站:

代码语言:javascript
复制
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:当前时区。如果未指定时间,则在日历时区中返回时间。

  • 结果提要中的Times将在此时区中表示。
  • 将所有空格替换为下划线(例如“ctz=America/洛杉矶”)。

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

我不打算在任何时候转移我的托管,但由于亚利桑那州不参加日光节约时间,我不能简单地增加两个小时的每一个日期。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-28 22:14:30

我仍然对其他想法持开放态度,但这是我要做的事情。我创建了自己的CalendarService类,它将日期转换为:

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

至:

2010-10-13 18:30:00

然后将这些日期转换为任何时区中相同的(并更正) DateTime。

代码语言:javascript
复制
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;
    }
}
票数 0
EN

Stack Overflow用户

发布于 2012-02-07 23:55:27

别反抗。Google.GData.Calendar库将每次设置为系统的本地时间。这是我能挖掘出来的

您需要从每个EventEntry转换所有这些时间

代码语言:javascript
复制
    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;

    }        
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4038373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档