Ical.Net重复日程事件各次实例的start开始日期如何获取?
问题原因
你当前代码中调用了.Select(o => o.Source),Source属性指向的是原始的日历事件模板对象,所有重复实例共享同一个模板对象,因此你只能拿到模板的固定起始时间,无法获取每个重复实例的实际时间。
正确取值方式
GetOccurrences()返回的每个Occurrence对象本身就存储了当前重复实例的专属时间信息,直接通过Occurrence.Period.Start即可获取该实例的实际开始时间,对应结束时间为Occurrence.Period.End。
修正后的代码示例
var now = DateTime.Parse("2021-09-16T10:00:00"); var later = now.AddHours(1); //Repeat daily for 5 days var rrule = new RecurrencePattern(FrequencyType.Daily, 1) { Count = 5 }; var e = new CalendarEvent { Start = new CalDateTime(now), End = new CalDateTime(later), RecurrenceRules = new List<RecurrencePattern> { rrule }, }; var calendar = new Calendar(); calendar.Events.Add(e); var startSearch = new CalDateTime(DateTime.Parse("2021-09-16T00:00:00")); var endSearch = new CalDateTime(DateTime.Parse("2021-09-21T23:59:59")); var occurrences = calendar.GetOccurrences(startSearch, endSearch) .Select(o => new { // 每个重复实例的实际开始时间,按需可直接转DateTime类型 InstanceStartTime = o.Period.Start.AsDateTime, // 若需要原事件的其他属性可保留引用 OriginalEvent = o.Source as CalendarEvent }) .ToList();
补充说明
- 若需要保留时区信息,可直接使用
o.Period.Start(CalDateTime类型),无需调用AsDateTime方法 - 若需要转换为UTC时间,可调用
o.Period.Start.AsUtc
内容的提问来源于stack exchange,提问作者TryIst
相关产品推荐
相关产品推荐

