// ---------------------------------------------------------------------- public void CalendarPeriodCollectorSample() { CalendarPeriodCollectorFilter filter = new CalendarPeriodCollectorFilter(); filter.Months.Add(YearMonth.January); // only Januaries filter.WeekDays.Add(DayOfWeek.Friday); // only Fridays filter.CollectingHours.Add(new HourRange(8, 18)); // working hours CalendarTimeRange testPeriod = new CalendarTimeRange(new DateTime(2010, 1, 1), new DateTime(2011, 12, 31)); Console.WriteLine("Calendar period collector of period: " + testPeriod); // > Calendar period collector of period: 01.01.2010 00:00:00 - 30.12.2011 23:59:59 | 728.23:59 CalendarPeriodCollector collector = new CalendarPeriodCollector(filter, testPeriod); collector.CollectHours(); foreach (ITimePeriod period in collector.Periods) { Console.WriteLine("Period: " + period); } // > Period: 01.01.2010; 08:00 - 17:59 | 0.09:59 // > Period: 08.01.2010; 08:00 - 17:59 | 0.09:59 // > Period: 15.01.2010; 08:00 - 17:59 | 0.09:59 // > Period: 22.01.2010; 08:00 - 17:59 | 0.09:59 // > Period: 29.01.2010; 08:00 - 17:59 | 0.09:59 // > Period: 07.01.2011; 08:00 - 17:59 | 0.09:59 // > Period: 14.01.2011; 08:00 - 17:59 | 0.09:59 // > Period: 21.01.2011; 08:00 - 17:59 | 0.09:59 // > Period: 28.01.2011; 08:00 - 17:59 | 0.09:59 } // CalendarPeriodCollectorSample
public void CollectHoursTest() { CalendarPeriodCollectorFilter filter = new CalendarPeriodCollectorFilter(); filter.Months.Add(YearMonth.January); filter.WeekDays.Add(DayOfWeek.Friday); filter.CollectingHours.Add(new HourRange(8, 18)); CalendarTimeRange testPeriod = new CalendarTimeRange(new DateTime(2010, 1, 1), new DateTime(2011, 12, 31)); CalendarPeriodCollector collector = new CalendarPeriodCollector(filter, testPeriod); collector.CollectHours(); Assert.AreEqual(collector.Periods.Count, 9); Assert.IsTrue(collector.Periods[0].IsSamePeriod(new CalendarTimeRange(new DateTime(2010, 1, 01, 8, 0, 0), new DateTime(2010, 1, 01, 18, 0, 0)))); Assert.IsTrue(collector.Periods[1].IsSamePeriod(new CalendarTimeRange(new DateTime(2010, 1, 08, 8, 0, 0), new DateTime(2010, 1, 08, 18, 0, 0)))); Assert.IsTrue(collector.Periods[2].IsSamePeriod(new CalendarTimeRange(new DateTime(2010, 1, 15, 8, 0, 0), new DateTime(2010, 1, 15, 18, 0, 0)))); Assert.IsTrue(collector.Periods[3].IsSamePeriod(new CalendarTimeRange(new DateTime(2010, 1, 22, 8, 0, 0), new DateTime(2010, 1, 22, 18, 0, 0)))); Assert.IsTrue(collector.Periods[4].IsSamePeriod(new CalendarTimeRange(new DateTime(2010, 1, 29, 8, 0, 0), new DateTime(2010, 1, 29, 18, 0, 0)))); Assert.IsTrue(collector.Periods[5].IsSamePeriod(new CalendarTimeRange(new DateTime(2011, 1, 07, 8, 0, 0), new DateTime(2011, 1, 07, 18, 0, 0)))); Assert.IsTrue(collector.Periods[6].IsSamePeriod(new CalendarTimeRange(new DateTime(2011, 1, 14, 8, 0, 0), new DateTime(2011, 1, 14, 18, 0, 0)))); Assert.IsTrue(collector.Periods[7].IsSamePeriod(new CalendarTimeRange(new DateTime(2011, 1, 21, 8, 0, 0), new DateTime(2011, 1, 21, 18, 0, 0)))); Assert.IsTrue(collector.Periods[8].IsSamePeriod(new CalendarTimeRange(new DateTime(2011, 1, 28, 8, 0, 0), new DateTime(2011, 1, 28, 18, 0, 0)))); } // CollectHoursTest
public void CollectAllDayHoursTest() { CalendarPeriodCollectorFilter filter = new CalendarPeriodCollectorFilter(); filter.Months.Add(YearMonth.January); filter.WeekDays.Add(DayOfWeek.Friday); filter.CollectingHours.Add(new HourRange(0, 24)); TimeRange testPeriod = new TimeRange(new DateTime(2010, 1, 1), new DateTime(2012, 1, 1)); TimeCalendar calendar = new TimeCalendar(new TimeCalendarConfig { EndOffset = TimeSpan.Zero }); CalendarPeriodCollector collector = new CalendarPeriodCollector(filter, testPeriod, SeekDirection.Forward, calendar); collector.CollectHours(); Assert.Equal(9, collector.Periods.Count); Assert.True(collector.Periods[0].IsSamePeriod(new TimeRange(new DateTime(2010, 1, 01), new DateTime(2010, 1, 02)))); Assert.True(collector.Periods[1].IsSamePeriod(new TimeRange(new DateTime(2010, 1, 08), new DateTime(2010, 1, 09)))); Assert.True(collector.Periods[2].IsSamePeriod(new TimeRange(new DateTime(2010, 1, 15), new DateTime(2010, 1, 16)))); Assert.True(collector.Periods[3].IsSamePeriod(new TimeRange(new DateTime(2010, 1, 22), new DateTime(2010, 1, 23)))); Assert.True(collector.Periods[4].IsSamePeriod(new TimeRange(new DateTime(2010, 1, 29), new DateTime(2010, 1, 30)))); Assert.True(collector.Periods[5].IsSamePeriod(new TimeRange(new DateTime(2011, 1, 07), new DateTime(2011, 1, 08)))); Assert.True(collector.Periods[6].IsSamePeriod(new TimeRange(new DateTime(2011, 1, 14), new DateTime(2011, 1, 15)))); Assert.True(collector.Periods[7].IsSamePeriod(new TimeRange(new DateTime(2011, 1, 21), new DateTime(2011, 1, 22)))); Assert.True(collector.Periods[8].IsSamePeriod(new TimeRange(new DateTime(2011, 1, 28), new DateTime(2011, 1, 29)))); } // CollectAllDayHoursTest
public void Excluded_slot() { var filter = new CalendarPeriodCollectorFilter(); filter.AddWorkingWeekDays(); filter.CollectingHours.Add(new HourRange(8, 12)); // working hours filter.CollectingHours.Add(new HourRange(14, 18)); // working hours filter.ExcludePeriods.Add(new CalendarTimeRange( DateTime.Parse("2014-07-15T09:30"), DateTime.Parse("2014-07-15T10:30") )); var testPeriod = new CalendarTimeRange(new DateTime(2014, 7, 14), new DateTime(2014, 7, 31)); Console.WriteLine("Calendar period collector of period: " + testPeriod); var collector = new CalendarPeriodCollector(filter, testPeriod); collector.CollectHours(); foreach (ITimePeriod period in collector.Periods) { Console.WriteLine("Period: " + period); } Assert.IsFalse(collector.Periods.Any(x => x.HasInside(DateTime.Parse("2014-07-15T10:00")))); Assert.IsTrue(collector.Periods.Any(x => x.HasInside(DateTime.Parse("2014-07-15T09:00")))); Assert.IsTrue(collector.Periods.Any(x => x.HasInside(DateTime.Parse("2014-07-15T11:00")))); }
public void CalendarPeriodCollectorSample() { CalendarPeriodCollectorFilter filter = new CalendarPeriodCollectorFilter(); filter.Months.Add( YearMonth.January ); // only Januaries filter.WeekDays.Add( DayOfWeek.Friday ); // only Fridays filter.CollectingHours.Add( new HourRange( 8, 18 ) ); // working hours CalendarTimeRange testPeriod = new CalendarTimeRange( new DateTime( 2010, 1, 1 ), new DateTime( 2011, 12, 31 ) ); Console.WriteLine( "Calendar period collector of period: " + testPeriod ); // > Calendar period collector of period: 01.01.2010 00:00:00 - 30.12.2011 23:59:59 | 728.23:59 CalendarPeriodCollector collector = new CalendarPeriodCollector( filter, testPeriod ); collector.CollectHours(); foreach ( ITimePeriod period in collector.Periods ) { Console.WriteLine( "Period: " + period ); } // > Period: 01.01.2010; 08:00 - 17:59 | 0.09:59 // > Period: 08.01.2010; 08:00 - 17:59 | 0.09:59 // > Period: 15.01.2010; 08:00 - 17:59 | 0.09:59 // > Period: 22.01.2010; 08:00 - 17:59 | 0.09:59 // > Period: 29.01.2010; 08:00 - 17:59 | 0.09:59 // > Period: 07.01.2011; 08:00 - 17:59 | 0.09:59 // > Period: 14.01.2011; 08:00 - 17:59 | 0.09:59 // > Period: 21.01.2011; 08:00 - 17:59 | 0.09:59 // > Period: 28.01.2011; 08:00 - 17:59 | 0.09:59 }
public void CollectHoursMissingLastPeriodTest() { CalendarPeriodCollectorFilter filter = new CalendarPeriodCollectorFilter(); filter.Months.Add(YearMonth.September); filter.WeekDays.Add(DayOfWeek.Monday); filter.WeekDays.Add(DayOfWeek.Tuesday); filter.WeekDays.Add(DayOfWeek.Wednesday); filter.WeekDays.Add(DayOfWeek.Thursday); filter.WeekDays.Add(DayOfWeek.Friday); filter.CollectingHours.Add(new HourRange(9, 17)); // working hours filter.ExcludePeriods.Add(new TimeBlock(new DateTime(2015, 9, 15, 00, 0, 0), new DateTime(2015, 9, 16, 0, 0, 0))); CalendarTimeRange testPeriod = new CalendarTimeRange(new DateTime(2015, 9, 14, 9, 0, 0), new DateTime(2015, 9, 17, 18, 0, 0)); CalendarPeriodCollector collector = new CalendarPeriodCollector(filter, testPeriod); collector.CollectHours(); Assert.Equal(3, collector.Periods.Count); } // CollectHoursMissingLastPeriodTest
/// <summary> /// The get remaining working time. /// </summary> /// <param name="start"> /// The start. /// </param> /// <param name="dueDate"> /// The due date. /// </param> /// <returns> /// The <see cref="TimeSpan"/>. /// </returns> public TimeSpan GetRemainingWorkingTime(DateTime start, DateTime dueDate) { var filter = new CalendarPeriodCollectorFilter(); foreach (var dayOfWeek in this.WorkDays) { filter.CollectingDayHours.Add(new DayHourRange(dayOfWeek.DayOfWeek, new Time(dayOfWeek.StartTime), new Time(dayOfWeek.EndTime))); } foreach (var holiday in this.Holidays) { filter.ExcludePeriods.Add(new TimeBlock(holiday.StartTime, holiday.EndTime)); } var range = new CalendarTimeRange(start, dueDate); var collector = new CalendarPeriodCollector(filter, range); collector.CollectHours(); var duration = collector.Periods.GetTotalDuration(new TimeZoneDurationProvider(TimeZoneInfo.FindSystemTimeZoneById("UTC"))); return duration; //var rounded = Math.Round(duration.TotalMinutes, MidpointRounding.AwayFromZero); //return TimeSpan.FromMinutes(rounded); }
public void CollectHoursTest() { //! 1월의 금요일의 8:00~18:00 까지 기간만을 계산한다. var filter = new CalendarPeriodCollectorFilter(); filter.Months.Add(January); filter.WeekDays.Add(DayOfWeek.Friday); filter.CollectingHours.Add(new HourRangeInDay(8, 18)); var testPeriod = new CalendarTimeRange(new DateTime(2010, 1, 1), new DateTime(2011, 12, 31)); var collector = new CalendarPeriodCollector(filter, testPeriod); collector.CollectHours(); Assert.AreEqual(collector.Periods.Count, 9); Assert.IsTrue( collector.Periods[0].IsSamePeriod(new CalendarTimeRange(new DateTime(2010, 1, 01, 8, 0, 0), new DateTime(2010, 1, 01, 18, 0, 0))), collector.Periods[0].ToString()); Assert.IsTrue( collector.Periods[1].IsSamePeriod(new CalendarTimeRange(new DateTime(2010, 1, 08, 8, 0, 0), new DateTime(2010, 1, 08, 18, 0, 0))), collector.Periods[1].ToString()); Assert.IsTrue( collector.Periods[2].IsSamePeriod(new CalendarTimeRange(new DateTime(2010, 1, 15, 8, 0, 0), new DateTime(2010, 1, 15, 18, 0, 0))), collector.Periods[2].ToString()); Assert.IsTrue( collector.Periods[3].IsSamePeriod(new CalendarTimeRange(new DateTime(2010, 1, 22, 8, 0, 0), new DateTime(2010, 1, 22, 18, 0, 0))), collector.Periods[3].ToString()); Assert.IsTrue( collector.Periods[4].IsSamePeriod(new CalendarTimeRange(new DateTime(2010, 1, 29, 8, 0, 0), new DateTime(2010, 1, 29, 18, 0, 0))), collector.Periods[4].ToString()); Assert.IsTrue( collector.Periods[5].IsSamePeriod(new CalendarTimeRange(new DateTime(2011, 1, 07, 8, 0, 0), new DateTime(2011, 1, 07, 18, 0, 0))), collector.Periods[5].ToString()); Assert.IsTrue( collector.Periods[6].IsSamePeriod(new CalendarTimeRange(new DateTime(2011, 1, 14, 8, 0, 0), new DateTime(2011, 1, 14, 18, 0, 0))), collector.Periods[6].ToString()); Assert.IsTrue( collector.Periods[7].IsSamePeriod(new CalendarTimeRange(new DateTime(2011, 1, 21, 8, 0, 0), new DateTime(2011, 1, 21, 18, 0, 0))), collector.Periods[7].ToString()); Assert.IsTrue( collector.Periods[8].IsSamePeriod(new CalendarTimeRange(new DateTime(2011, 1, 28, 8, 0, 0), new DateTime(2011, 1, 28, 18, 0, 0))), collector.Periods[8].ToString()); }
public void CollectHoursTest() { CalendarPeriodCollectorFilter filter = new CalendarPeriodCollectorFilter(); filter.Months.Add( YearMonth.January ); filter.WeekDays.Add( DayOfWeek.Friday ); filter.CollectingHours.Add( new HourRange( 8, 18 ) ); CalendarTimeRange testPeriod = new CalendarTimeRange( new DateTime( 2010, 1, 1 ), new DateTime( 2011, 12, 31 ) ); CalendarPeriodCollector collector = new CalendarPeriodCollector( filter, testPeriod ); collector.CollectHours(); Assert.AreEqual( collector.Periods.Count, 9 ); Assert.IsTrue( collector.Periods[ 0 ].IsSamePeriod( new CalendarTimeRange( new DateTime( 2010, 1, 01, 8, 0, 0 ), new DateTime( 2010, 1, 01, 18, 0, 0 ) ) ) ); Assert.IsTrue( collector.Periods[ 1 ].IsSamePeriod( new CalendarTimeRange( new DateTime( 2010, 1, 08, 8, 0, 0 ), new DateTime( 2010, 1, 08, 18, 0, 0 ) ) ) ); Assert.IsTrue( collector.Periods[ 2 ].IsSamePeriod( new CalendarTimeRange( new DateTime( 2010, 1, 15, 8, 0, 0 ), new DateTime( 2010, 1, 15, 18, 0, 0 ) ) ) ); Assert.IsTrue( collector.Periods[ 3 ].IsSamePeriod( new CalendarTimeRange( new DateTime( 2010, 1, 22, 8, 0, 0 ), new DateTime( 2010, 1, 22, 18, 0, 0 ) ) ) ); Assert.IsTrue( collector.Periods[ 4 ].IsSamePeriod( new CalendarTimeRange( new DateTime( 2010, 1, 29, 8, 0, 0 ), new DateTime( 2010, 1, 29, 18, 0, 0 ) ) ) ); Assert.IsTrue( collector.Periods[ 5 ].IsSamePeriod( new CalendarTimeRange( new DateTime( 2011, 1, 07, 8, 0, 0 ), new DateTime( 2011, 1, 07, 18, 0, 0 ) ) ) ); Assert.IsTrue( collector.Periods[ 6 ].IsSamePeriod( new CalendarTimeRange( new DateTime( 2011, 1, 14, 8, 0, 0 ), new DateTime( 2011, 1, 14, 18, 0, 0 ) ) ) ); Assert.IsTrue( collector.Periods[ 7 ].IsSamePeriod( new CalendarTimeRange( new DateTime( 2011, 1, 21, 8, 0, 0 ), new DateTime( 2011, 1, 21, 18, 0, 0 ) ) ) ); Assert.IsTrue( collector.Periods[ 8 ].IsSamePeriod( new CalendarTimeRange( new DateTime( 2011, 1, 28, 8, 0, 0 ), new DateTime( 2011, 1, 28, 18, 0, 0 ) ) ) ); }
// ---------------------------------------------------------------------- public TimeSpan Difference( DateTime date1, DateTime date2 ) { if ( date1.Equals( date2 ) ) { return TimeSpan.Zero; } if ( collectorFilter.WeekDays.Count == 0 && collectorFilter.CollectingHours.Count == 0 && collectorFilter.CollectingDayHours.Count == 0 ) { return new DateDiff( date1, date2, calendar.Culture.Calendar, calendar.FirstDayOfWeek, calendar.YearBaseMonth ).Difference; } TimeRange differenceRange = new TimeRange( date1, date2 ); CalendarPeriodCollector collector = new CalendarPeriodCollector( collectorFilter, new TimeRange( differenceRange.Start.Date, differenceRange.End.Date.AddDays( 1 ) ), SeekDirection.Forward, calendar ); collector.CollectHours(); // calculate gaps TimeGapCalculator<TimeRange> gapCalculator = new TimeGapCalculator<TimeRange>( calendar ); ITimePeriodCollection gaps = gapCalculator.GetGaps( collector.Periods, differenceRange ); // calculate difference (sum gap durations) TimeSpan difference = TimeSpan.Zero; foreach ( ITimePeriod gap in gaps ) { difference = difference.Add( gap.Duration ); } return date1 < date2 ? difference : difference.Negate(); }
// ---------------------------------------------------------------------- private IEnumerable<ITimePeriod> GetAvailableWeekPeriods( ITimePeriod period ) { if ( weekDays.Count == 0 && workingHours.Count == 0 && WorkingDayHours.Count == 0 ) { return new TimePeriodCollection { period }; } CalendarPeriodCollectorFilter filter = new CalendarPeriodCollectorFilter(); // days foreach ( DayOfWeek weekDay in weekDays ) { filter.WeekDays.Add( weekDay ); } // hours foreach ( HourRange workingHour in workingHours ) { filter.CollectingHours.Add( workingHour ); } // day hours foreach ( DayHourRange workingDayHour in workingDayHours ) { filter.CollectingDayHours.Add( workingDayHour ); } CalendarPeriodCollector weekCollector = new CalendarPeriodCollector( filter, period, SeekDirection.Forward, calendar ); weekCollector.CollectHours(); return weekCollector.Periods; }
/// <summary> /// <paramref name="period"/> 기간 내에서 예외 기간등을 제외한 기간들을 HourRange 컬렉션으로 단위로 반환합니다. /// </summary> /// <param name="period"></param> /// <returns></returns> private IEnumerable<ITimePeriod> GetAvailableWeekPeriods(ITimePeriod period) { period.ShouldNotBeNull("period"); if(WeekDays.Count == 0 && WorkingHours.Count == 0 && WorkingDayHours.Count == 0) return new TimePeriodCollection { period }; // 필터에 필터링할 정보를 추가합니다. // var filter = new CalendarPeriodCollectorFilter(); WeekDays.RunEach(weekDay => filter.WeekDays.Add(weekDay)); WorkingHours.RunEach(workingHour => filter.CollectingHours.Add(workingHour)); WorkingDayHours.RunEach(workingDayHour => filter.CollectingDayHours.Add(workingDayHour)); var weekCollector = new CalendarPeriodCollector(filter, period, SeekDirection.Forward, TimeCalendar); weekCollector.CollectHours(); return weekCollector.Periods; }
// ---------------------------------------------------------------------- public TimeSpan CalcWorkingPeriod( DateTime start, DateTime end, ITimePeriodCollection excludePeriods = 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 ); // search filter CalendarPeriodCollectorFilter filter = new CalendarPeriodCollectorFilter(); filter.AddWorkingWeekDays(); // working days if ( excludePeriods != null ) { filter.ExcludePeriods.AddAll( excludePeriods ); } filter.CollectingHours.Add( new HourRange( 07, 12 ) ); // working hours filter.CollectingHours.Add( new HourRange( 13, 19 ) ); // working hours // collect working hours TimeCalendar calendar = new TimeCalendar( new TimeCalendarConfig { EndOffset = TimeSpan.Zero } ); CalendarPeriodCollector collector = new CalendarPeriodCollector( filter, searchPeriod, SeekDirection.Forward, calendar ); collector.CollectHours(); TimeSpan workingPeriod = new TimeSpan(); foreach ( ICalendarTimeRange period in collector.Periods ) { // get the intersection of the test-range and the day working-hours ITimePeriod intersection = testRange.GetIntersection( period ); if ( intersection == null ) { continue; } workingPeriod = workingPeriod.Add( intersection.Duration ); } return workingPeriod; }
// ---------------------------------------------------------------------- public double CalculateBusinessHours( CalendarTimeRange testPeriod, ITimePeriodCollection holidays = null ) { CalendarPeriodCollectorFilter filter = new CalendarPeriodCollectorFilter(); filter.CollectingMonths.Add( new MonthRange( YearMonth.January, YearMonth.January ) ); filter.CollectingDays.Add( new DayRange( 1, 1 ) ); filter.AddWorkingWeekDays(); // only working days filter.CollectingHours.Add( new HourRange( 8, 12 ) ); // opening hours morning filter.CollectingHours.Add( new HourRange( 13, 18 ) ); // opening hours afternoon if ( holidays != null ) { filter.ExcludePeriods.AddAll( holidays ); } CalendarPeriodCollector collector = new CalendarPeriodCollector( filter, testPeriod ); collector.CollectHours(); double businessHours = 0.0; foreach ( ICalendarTimeRange period in collector.Periods ) { businessHours += Math.Round( period.Duration.TotalHours, 2 ); } return businessHours; }
// ---------------------------------------------------------------------- private double CalculateBusinessHours( ITimePeriod timePeriod ) { double businessHours = 0; // collect filter CalendarPeriodCollectorFilter filter = new CalendarPeriodCollectorFilter(); filter.AddWorkingWeekDays(); filter.CollectingHours.Add( new HourRange( 8, 18 ) ); //filter.ExcludePeriods.Add( new Day( 2012, 4, 6 ) ); // mor exclude periods // collect the working hours TimeRange collectorTimeRange = new TimeRange( timePeriod.Start.Date, timePeriod.End.Date.AddDays( 1 ) ); TimeCalendar calendar = new TimeCalendar( new TimeCalendarConfig { EndOffset = TimeSpan.Zero } ); CalendarPeriodCollector collector = new CalendarPeriodCollector( filter, collectorTimeRange, SeekDirection.Forward, calendar ); collector.CollectHours(); if ( collector.Periods.Count > 0 ) { // calculate the business hour periods collector.Periods.Add( timePeriod ); // add source period to find the intersections TimePeriodIntersector<TimeRange> intersector = new TimePeriodIntersector<TimeRange>(); ITimePeriodCollection businessHourPeriods = intersector.IntersectPeriods( collector.Periods ); // collect the business hours foreach ( TimeRange businessHourPeriod in businessHourPeriods ) { businessHours += businessHourPeriod.Duration.TotalHours; } } return businessHours; }
public void WorkingHourSum() { DateTime start = new DateTime( 2011, 9, 11, 18, 0, 0 ); DateTime end = new DateTime( 2011, 9, 15, 9, 0, 0 ); // collect working hours CalendarPeriodCollectorFilter filter = new CalendarPeriodCollectorFilter(); filter.CollectingDayHours.Add( new DayHourRange( DayOfWeek.Monday, 8, 12 ) ); filter.CollectingDayHours.Add( new DayHourRange( DayOfWeek.Tuesday, 8, 12 ) ); filter.CollectingDayHours.Add( new DayHourRange( DayOfWeek.Wednesday, 8, 12 ) ); filter.CollectingDayHours.Add( new DayHourRange( DayOfWeek.Thursday, 8, 12 ) ); filter.CollectingDayHours.Add( new DayHourRange( DayOfWeek.Friday, 8, 12 ) ); filter.ExcludePeriods.Add( new Day( 2011, 9, 13 ) ); // exclude Tuesday CalendarPeriodCollector collector = new CalendarPeriodCollector( filter, new TimeRange( start.Date, end.Date.AddDays( 1 ) ), SeekDirection.Forward, new TimeCalendar( new TimeCalendarConfig { EndOffset = TimeSpan.Zero } ) ); collector.CollectHours(); // add boundaries collector.Periods.Add( new TimeRange( start, end ) ); // intersect periods TimePeriodIntersector<TimeRange> periodIntersector = new TimePeriodIntersector<TimeRange>(); ITimePeriodCollection periods = periodIntersector.IntersectPeriods( collector.Periods ); // calculate working hours (sum period durations) TimeSpan workingHours = TimeSpan.Zero; foreach ( ITimePeriod period in periods ) { workingHours = workingHours.Add( period.Duration ); } Console.WriteLine( "Total working hours: " + workingHours ); // > Total working hours: 09:00:00 }