我已经进行了一些测试。这是我的代码:
var systemTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
var icalTimeZone = iCalTimeZone.FromSystemTimeZone(systemTimeZone);
var startTimeSearch = new DateTime(2015, 9, 8, 0, 0, 0, DateTimeKind.Utc);
var endTimeSearch = new DateTime(2015, 12, 1, 00, 0, 0, DateTimeKind.Utc);
var iCalendar = new iCalendar();
var pacificTimeZone = _iCalendar.AddTimeZone(icalTimeZone);
var event = new Event
{
Summary = "This is an event at 2015-09-08 10:30 PST (2015-09-08 17:30 UTC)",
DTStart = new iCalDateTime(2015, 9, 8, 10, 30, 0, pacificTimeZone.TZID, iCalendar),
Duration = new TimeSpan(0, 1, 0, 0)
};
var rp = new RecurrencePattern("FREQ=WEEKLY;UNTIL=20151112T080000Z;WKST=SU;BYDAY=TU");
event.RecurrenceRules.Add(rp);
iCalendar.Events.Add(_event);
var occurrences = iCalendar.GetOccurrences(startTimeSearch, endTimeSearch);
结果如下:
10次出现 - 这里是出现的' Period.StartTime.Value和UTC属性
价值 - 2015年9月8日10:30:00 - UTC 9/8/2015 17:30:00
价值 - 2015年9月15日10:30:00 - UTC 2015年9月15日17:30:00
价值 - 2015年9月22日10:30:00 - UTC 2015年9月22日17:30:00
价值 - 2015年9月29日10:30:00 - UTC 9/29/2015 17:30:00
价值 - 2015年10月6日10:30:00 - UTC 10/6/2015 17:30:00
价值 - 2015年10月13日10:30:00 - UTC 10/13/2015 17:30:00
价值 - 2015年10月20日10:30:00 - UTC 10/20/2015 17:30:00
价值 - 2015年10月27日10:30:00 - UTC 2015年10月27日17:30:00
价值 -11/3/2015 10:30:00 - UTC 11/3/2015 17:30:00 (这应该是18:30:00 !)
价值 - 11/10/2015 10:30:00 - UTC 11/10/2015 17:30:00 (这应该是18:30:00 !)
如您所见,最后两个的UTC时间应为18:30:00。所以我想知道这是否只是DDay Ical的工作方式,我不应指望它正确地将UTC日期时间,或者如果我做错了。
答案 0 :(得分:8)
由于夏令时,你得到的时间差异。一种可能的解决方案是不按名称Pacific Standard Time
// First load a file containing time zone information for Pacific Standard Time
var systemTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
代替此使用系统时区,如
var systemTimeZone = TimeZoneInfo.GetSystemTimeZones().FirstOrDefault();
或者只需添加本地时区:
iCalendar iCalendar= new iCalendar();
iCalendar.AddLocalTimeZone();
要查找所有已注册的时区,click here
ReadOnlyCollection<TimeZoneInfo> zones = TimeZoneInfo.GetSystemTimeZones();
Console.WriteLine("The local system has the following {0} time zones", zones.Count);
foreach (TimeZoneInfo zone in zones)
Console.WriteLine(zone.Id);
我只是在我的代码中使用GetSystemTimeZones()
,如
public static void Test1()
{
var systemTimeZone = TimeZoneInfo.GetSystemTimeZones().FirstOrDefault();
//TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
var icalTimeZone = iCalTimeZone.FromSystemTimeZone(systemTimeZone);
var startTimeSearch = new DateTime(2015, 9, 8, 0, 0, 0, DateTimeKind.Utc);
var endTimeSearch = new DateTime(2015, 12, 1, 00, 0, 0, DateTimeKind.Utc);
var iCalendar = new iCalendar();
var pacificTimeZone = iCalendar.AddTimeZone(icalTimeZone);
var _event =
new Event
{
Summary = "This is an event at 2015-09-08 10:30 PST (2015-09-08 17:30 UTC)",
DTStart = new iCalDateTime(2015, 9, 8, 10, 30, 0, pacificTimeZone.TZID, iCalendar),
Duration = new TimeSpan(0, 1, 0, 0)
};
var rp = new RecurrencePattern("FREQ=WEEKLY;UNTIL=20151112T080000Z;WKST=SU;BYDAY=TU");
_event.RecurrenceRules.Add(rp);
iCalendar.Events.Add(_event);
var occurrences = iCalendar.GetOccurrences(startTimeSearch, endTimeSearch);
}
当我调试它得到输出像
您可以相应地更改时区并获得结果。希望它可以帮到你。
答案 1 :(得分:2)
Don't use dday.ical;使用ical.net。
这应该让你开始:
var iCalendar = new Calendar();
var start = new DateTime(2015, 9, 8, 10, 30, 0);
var e = new Event
{
Summary = "This is an event at 2015-09-08 10:30 PST (2015-09-08 17:30 UTC)",
DtStart = new CalDateTime(start, "Pacific Standard Time"),
Duration = TimeSpan.FromHours(1)
};
var rp = new RecurrencePattern("FREQ=WEEKLY;UNTIL=20151112T080000Z;WKST=SU;BYDAY=TU");
e.RecurrenceRules.Add(rp);
iCalendar.Events.Add(e);
var startTimeSearch = new DateTime(2015, 9, 8, 0, 0, 0, DateTimeKind.Utc);
var endTimeSearch = new DateTime(2015, 12, 1, 00, 0, 0, DateTimeKind.Utc);
var occurrences = iCalendar.GetOccurrences(startTimeSearch, endTimeSearch);
<强>结果:强>
答案 2 :(得分:0)
我可以解决这个问题。事实证明,您不应在ExceptionDates
中指定时间,只需添加日期组件,
这似乎有效,GetOccurances
现在可以正确识别异常日期。希望这将有助于某些人经历同样的痛苦。