} // CalcDayllightDuration // ---------------------------------------------------------------------- protected virtual TimeSpan DoCalcDuration(DateTime start, DateTime end, TimeZoneInfo timeZone = null) { if (start.Equals(end)) { return(TimeSpan.Zero); } // test range TimeRange testRange = new TimeRange(start, end); // search range DateTime searchStart = new Day(testRange.Start).Start; DateTime serachEnd = new Day(testRange.End).GetNextDay().Start; TimeRange searchPeriod = new TimeRange(searchStart, serachEnd); // exclude periods filter.ExcludePeriods.Clear(); filter.ExcludePeriods.AddAll(excludePeriods); // collect hours TimeCalendar calendar = new TimeCalendar(new TimeCalendarConfig { EndOffset = TimeSpan.Zero }); CalendarPeriodCollector collector = new CalendarPeriodCollector(filter, searchPeriod, SeekDirection.Forward, calendar); collector.CollectHours(); TimeSpan duration = TimeSpan.Zero; collector.Periods.AddAll(includePeriods); foreach (ICalendarTimeRange period in collector.Periods) { // get the intersection of the test-range and the day hours ITimePeriod intersection = testRange.GetIntersection(period); if (intersection == null) { continue; } duration = duration.Add(durationProvider.GetDuration(intersection.Start, intersection.End)); } return(start < end ? duration : duration.Negate()); } // DoCalcDuration