public void MomentTest() { TimeRange period1 = new TimeRange( new DateTime( 2011, 3, 1 ), new DateTime( 2011, 3, 10 ) ); TimeRange period2 = new TimeRange( new DateTime( 2011, 3, 5 ), new DateTime( 2011, 3, 05 ) ); TimePeriodIntersector<TimeRange> periodIntersector = new TimePeriodIntersector<TimeRange>(); ITimePeriodCollection periods = periodIntersector.IntersectPeriods( new TimePeriodCollection { period1, period2 } ); Assert.AreEqual( periods.Count, 0 ); }
public void MultipeTouchingIntersection1Test() { TimeRange period1 = new TimeRange( new DateTime( 2011, 3, 01 ), new DateTime( 2011, 3, 10 ) ); TimeRange period2 = new TimeRange( new DateTime( 2011, 3, 05 ), new DateTime( 2011, 3, 20 ) ); TimeRange period3 = new TimeRange( new DateTime( 2011, 3, 15 ), new DateTime( 2011, 3, 25 ) ); TimePeriodIntersector<TimeRange> periodIntersector = new TimePeriodIntersector<TimeRange>(); ITimePeriodCollection periods = periodIntersector.IntersectPeriods( new TimePeriodCollection { period1, period2, period3 } ); Assert.AreEqual( periods.Count, 2 ); Assert.IsTrue( periods[ 0 ].IsSamePeriod( new TimeRange( new DateTime( 2011, 3, 05 ), new DateTime( 2011, 3, 10 ) ) ) ); Assert.IsTrue( periods[ 1 ].IsSamePeriod( new TimeRange( new DateTime( 2011, 3, 15 ), new DateTime( 2011, 3, 20 ) ) ) ); }
public void MultipeTouchingIntersection2Test() { TimeRange period1 = new TimeRange( new DateTime( 2011, 3, 01 ), new DateTime( 2011, 3, 10 ) ); TimeRange period2 = new TimeRange( new DateTime( 2011, 3, 04 ), new DateTime( 2011, 3, 10 ) ); TimeRange period3 = new TimeRange( new DateTime( 2011, 3, 06 ), new DateTime( 2011, 3, 10 ) ); TimeRange period4 = new TimeRange( new DateTime( 2011, 3, 10 ), new DateTime( 2011, 3, 14 ) ); TimeRange period5 = new TimeRange( new DateTime( 2011, 3, 10 ), new DateTime( 2011, 3, 16 ) ); TimeRange period6 = new TimeRange( new DateTime( 2011, 3, 10 ), new DateTime( 2011, 3, 20 ) ); TimePeriodIntersector<TimeRange> periodIntersector = new TimePeriodIntersector<TimeRange>(); ITimePeriodCollection periods = periodIntersector.IntersectPeriods( new TimePeriodCollection { period1, period2, period3, period4, period5, period6 } ); Assert.AreEqual( periods.Count, 1 ); Assert.IsTrue( periods[ 0 ].IsSamePeriod( new TimeRange( new DateTime( 2011, 3, 04 ), new DateTime( 2011, 3, 16 ) ) ) ); }
public void NoPeriodsTest() { TimePeriodIntersector<TimeRange> periodIntersector = new TimePeriodIntersector<TimeRange>(); ITimePeriodCollection periods = periodIntersector.IntersectPeriods( new TimePeriodCollection() ); Assert.AreEqual( periods.Count, 0 ); }
public void SingleIntersection3Test() { TimeRange period1 = new TimeRange( new DateTime( 2011, 3, 01 ), new DateTime( 2011, 3, 20 ) ); TimeRange period2 = new TimeRange( new DateTime( 2011, 3, 10 ), new DateTime( 2011, 3, 20 ) ); TimePeriodIntersector<TimeRange> periodIntersector = new TimePeriodIntersector<TimeRange>(); ITimePeriodCollection periods = periodIntersector.IntersectPeriods( new TimePeriodCollection { period1, period2 } ); Assert.AreEqual( periods.Count, 1 ); Assert.IsTrue( periods[ 0 ].IsSamePeriod( new TimeRange( new DateTime( 2011, 3, 10 ), new DateTime( 2011, 3, 20 ) ) ) ); }
public void SinglePeriodAnytimeTest() { TimePeriodIntersector<TimeRange> periodIntersector = new TimePeriodIntersector<TimeRange>(); ITimePeriodCollection periods = periodIntersector.IntersectPeriods( new TimePeriodCollection { TimeRange.Anytime } ); Assert.AreEqual( periods.Count, 0 ); }
public void NotCombinedIntersection4Test() { TimeRange period1 = new TimeRange( new DateTime( 2011, 3, 01 ), new DateTime( 2011, 3, 10 ) ); TimeRange period2 = new TimeRange( new DateTime( 2011, 3, 01 ), new DateTime( 2011, 3, 05 ) ); TimeRange period3 = new TimeRange( new DateTime( 2011, 3, 04 ), new DateTime( 2011, 3, 06 ) ); TimeRange period4 = new TimeRange( new DateTime( 2011, 3, 05 ), new DateTime( 2011, 3, 10 ) ); TimePeriodIntersector<TimeRange> periodIntersector = new TimePeriodIntersector<TimeRange>(); ITimePeriodCollection periods = periodIntersector.IntersectPeriods( new TimePeriodCollection { period1, period2, period3, period4 }, false ); Assert.AreEqual( periods.Count, 4 ); Assert.IsTrue( periods[ 0 ].IsSamePeriod( new TimeRange( new DateTime( 2011, 3, 01 ), new DateTime( 2011, 3, 04 ) ) ) ); Assert.IsTrue( periods[ 1 ].IsSamePeriod( new TimeRange( new DateTime( 2011, 3, 04 ), new DateTime( 2011, 3, 05 ) ) ) ); Assert.IsTrue( periods[ 2 ].IsSamePeriod( new TimeRange( new DateTime( 2011, 3, 05 ), new DateTime( 2011, 3, 06 ) ) ) ); Assert.IsTrue( periods[ 3 ].IsSamePeriod( new TimeRange( new DateTime( 2011, 3, 06 ), new DateTime( 2011, 3, 10 ) ) ) ); }
public void TimePeriodIntersectorSample() { TimePeriodCollection periods = new TimePeriodCollection(); periods.Add( new TimeRange( new DateTime( 2011, 3, 01 ), new DateTime( 2011, 3, 10 ) ) ); periods.Add( new TimeRange( new DateTime( 2011, 3, 05 ), new DateTime( 2011, 3, 15 ) ) ); periods.Add( new TimeRange( new DateTime( 2011, 3, 12 ), new DateTime( 2011, 3, 18 ) ) ); periods.Add( new TimeRange( new DateTime( 2011, 3, 20 ), new DateTime( 2011, 3, 24 ) ) ); periods.Add( new TimeRange( new DateTime( 2011, 3, 22 ), new DateTime( 2011, 3, 28 ) ) ); periods.Add( new TimeRange( new DateTime( 2011, 3, 24 ), new DateTime( 2011, 3, 26 ) ) ); TimePeriodIntersector<TimeRange> periodIntersector = new TimePeriodIntersector<TimeRange>(); ITimePeriodCollection intersectedPeriods = periodIntersector.IntersectPeriods( periods ); foreach ( ITimePeriod intersectedPeriod in intersectedPeriods ) { Console.WriteLine( "Intersected Period: " + intersectedPeriod ); } // > Intersected Period: 05.03.2011 - 10.03.2011 | 5.00:00 // > Intersected Period: 12.03.2011 - 15.03.2011 | 3.00:00 // > Intersected Period: 22.03.2011 - 26.03.2011 | 4.00:00 }
public void GetFreeBusyRequestTimePeriodIntersectorTest() { //取得會議室資訊 var calendarAttributes = "fullName,email"; var searchMeetingRooms = new SearchCalendarResourcesRequest(calendarAttributes); ZmailRequest.ApiRequest = searchMeetingRooms; var zResquestRoom = ZmailDispatcher.SendRequest(ZmailRequest); var respRoom = zResquestRoom.ApiResponse as SearchCalendarResourcesResponse; var crList = respRoom?.CalendarResourceList; if (crList != null) { var crEmails = crList.Select(cr => cr.AttributesList.Where(ar => ar.Key.Equals("email")).Select(ar => ar.Value).FirstOrDefault()); var sdate = DateTime.Now; var edate = sdate.AddDays(7); //多人請用逗號隔開 var crEmailStrings = string.Join(",", crEmails.ToArray()); var searchNames = "[email protected],[email protected]," + crEmailStrings; ZmailRequest.ApiRequest = new GetFreeBusyRequest(sdate, edate, searchNames); var zResquest = ZmailDispatcher.SendRequest(ZmailRequest); var resp = zResquest.ApiResponse as GetFreeBusyResponse; var wkHours = resp?.Workinghours; if (wkHours != null) { var periods = new Dictionary <string, TimePeriodCollection>(); var users = wkHours.Users.Where(u => !crEmails.Contains(u.id)); //找出所有人的共同時間 var periodIntersector = new TimePeriodIntersector <TimeRange>(); var resultPeriods = new TimePeriodCollection(); var idx = 0; foreach (var user in users) { Console.WriteLine(user.id); Console.WriteLine("Free"); var userPeriods = new TimePeriodCollection(); foreach (var f in user.Fs) { Console.WriteLine($" {f.s} - {f.e}"); userPeriods.Add(new TimeRange(f.s, f.e)); } periods.Add(user.id, userPeriods); if (idx == 0) { resultPeriods.AddAll(user.Fs.Select(f => new TimeRange(f.s, f.e))); } else { resultPeriods.AddAll(user.Fs.Select(f => new TimeRange(f.s, f.e))); if (resultPeriods.Any()) { var intersectedPeriods = periodIntersector.IntersectPeriods(resultPeriods, false); resultPeriods.Clear(); resultPeriods.AddAll(intersectedPeriods.Select(p => new TimeRange(p.Start, p.End))); } } } Console.WriteLine("...共同的時間..."); foreach (var intersectedPeriod in resultPeriods) { Console.WriteLine("所有人共同的的時間 Period: " + intersectedPeriod); } //對應到會議室 var crs = wkHours.Users.Where(u => crEmails.Contains(u.id)); foreach (var cr in crList) { var email = cr.AttributesList.Where(ar => ar.Key.Equals("email")) .Select(ar => ar.Value) .FirstOrDefault(); var fullName = cr.AttributesList.Where(ar => ar.Key.Equals("fullName")) .Select(ar => ar.Value) .FirstOrDefault(); Console.WriteLine($"{fullName}:{email}"); var crHour = wkHours.Users.FirstOrDefault(u => u.id.Equals(email)); if (crHour != null) { var crPeriods = new TimePeriodCollection(); crPeriods.AddAll(resultPeriods.Select(p => new TimeRange(p.Start, p.End))); crPeriods.AddAll(crHour.Fs.Select(f => new TimeRange(f.s, f.e))); var intersectedPeriods = periodIntersector.IntersectPeriods(crPeriods, false); Console.WriteLine($"{fullName}:{email}...共同的時間..."); foreach (var intersectedPeriod in intersectedPeriods) { Console.WriteLine(" Period: " + intersectedPeriod); } } } } } }
// ---------------------------------------------------------------------- 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 }