我有以下代码可用于我的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:当前时区。如果未指定时间,则在日历时区中返回时间。
但是我的服务器托管在亚利桑那州,所以(目前)日历上的所有日期都比它们应该提前两个小时。我做错了什么吗?即使服务器位于亚利桑那州,如何将提要中的日期放在中央时区?
我不打算在任何时候转移我的托管,但由于亚利桑那州不参加日光节约时间,我不能简单地增加两个小时的每一个日期。
发布于 2010-10-28 22:14:30
我仍然对其他想法持开放态度,但这是我要做的事情。我创建了自己的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;
}
}发布于 2012-02-07 23:55:27
别反抗。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;
} https://stackoverflow.com/questions/4038373
复制相似问题