public override IEnumerable<DateTime> GetForYear(Holiday holiday, int year)
        {
            if (year < DateTime.MinValue.Year)
                throw new ArgumentOutOfRangeException("year", "value for year is below the minimum value");

            var daysInMonthThisYear = DateTime.DaysInMonth(year, holiday.FirstTime.Month);
            if (holiday.FirstTime.Day > daysInMonthThisYear)
                yield break;

            var firstDayThisYear = new DateTime(year, holiday.FirstTime.Month, holiday.FirstTime.Day);

            int count = 0;
            int daysFilled = 0;
            while (daysFilled < holiday.NumberOfDays)
            {
                var date = firstDayThisYear.AddDays(count);
                count++;

                if (SubstituteWeekends && date.IsWeekend())
                    continue;

                yield return date;
                daysFilled++;
            }
        }
        public override IEnumerable<DateTime> GetForYear(Holiday holiday, int year)
        {
            if (year < DateTime.MinValue.Year)
                throw new ArgumentOutOfRangeException("year", "value for year is below the minimum value");

            var firstDayInMonth = new DateTime(year, (int) Month, 1);

            var days = firstDayInMonth.AllDaysInTheMonth();

            var firstHolidayDay = days.FirstOrDefault(d => d.DayOfWeek == DayOfWeek && d.WeekOfMonth() == (int) Week);

            if (firstHolidayDay == default(DateTime))
                yield break; // we could not find that recurrance for the given year

            int count = 0;
            int daysFilled = 0;
            while (daysFilled < holiday.NumberOfDays)
            {
                var date = firstHolidayDay.AddDays(count);
                count++;

                if (SubstituteWeekends && date.IsWeekend())
                    continue;

                daysFilled++;
                yield return date;
            }
        }
Exemplo n.º 3
0
        static void Main(string[] args)
        {
            /// TASK 1: Weekday counting

            // Monday 07-Oct-2013 and Wednesday 09-Oct-2013 : should return 1
            int value1 = BusinessDayCounter.WeekdaysBetweenTwoDates(new DateTime(2013, 10, 7), new DateTime(2013, 10, 9));
            Debug.Assert(value1 == 1);

            // Saturday 05-Oct-2013 and Monday 14-Oct-2013 : should return 5
            int value2 = BusinessDayCounter.WeekdaysBetweenTwoDates(new DateTime(2013, 10, 5), new DateTime(2013, 10, 14));
            Debug.Assert(value2 == 5);

            // Monday 07-Oct-2013 and Wednesday 01-Jan-2014 : should return 61
            int value3 = BusinessDayCounter.WeekdaysBetweenTwoDates(new DateTime(2013, 10, 7), new DateTime(2014, 1, 1));
            Debug.Assert(value3 == 61);

            // Monday 07-Oct-2013 and Saturday 05-Oct-2013 : should return 0 (second date earlier than first date)
            int value4 = BusinessDayCounter.WeekdaysBetweenTwoDates(new DateTime(2013, 10, 7), new DateTime(2013, 10, 5));
            Debug.Assert(value4 == 0);

            /// TASK 2: Business day counting

            // Public holiday list containing Christmas Day, Boxing Day and New Year's Day
            List<DateTime> publicHolidays = new List<DateTime>
            {
                new DateTime(2013, 12, 25),
                new DateTime(2013, 12, 26),
                new DateTime(2014, 1, 1)
            };

            // Monday 07-Oct-2013 and Wednesday 09-Oct-2013 : should still return 1
            int value5 = BusinessDayCounter.BusinessDaysBetweenTwoDates(new DateTime(2013, 10, 7), new DateTime(2013, 10, 9), publicHolidays);
            Debug.Assert(value5 == 1);

            // Tuesday 24-Dec-2013 and Friday 27-Dec-2013 : should return 0, both days are public holidays
            int value6 = BusinessDayCounter.BusinessDaysBetweenTwoDates(new DateTime(2013, 12, 24), new DateTime(2013, 12, 27), publicHolidays);
            Debug.Assert(value6 == 0);

            // Monday 07-Oct-2013 and Wednesday 01-Jan-2014 : should return 59
            int value7 = BusinessDayCounter.BusinessDaysBetweenTwoDates(new DateTime(2013, 10, 7), new DateTime(2014, 1, 1), publicHolidays);
            Debug.Assert(value7 == 59);

            // test a fixed date recurrance holiday
            var fixedRecurranceHoliday = new Holiday(new DateTime(1981, 8, 15), 3);
            var value8 = fixedRecurranceHoliday.GetForYear(2014);
            Debug.Assert(value8.Count() == 3 && value8.First() == new DateTime(2014, 8, 15) && value8.All(d => d.IsBusinessDay()));

            // test a specific day of week/month annual recurrance holiday
            var variable_reccurance = new DayOfWeekAnnualReccurance(DayOfWeek.Thursday, WeekOfMonth.SecondWeek, Month.August);
            var variableRecurranceHoliday = new Holiday(new DateTime(1981, 8, 18), 3, variable_reccurance);
            var value9 = variableRecurranceHoliday.GetForYear(2014);
            Debug.Assert(value9.Count() == 3 && value9.First() == new DateTime(2014, 8, 14));
        }
Exemplo n.º 4
0
 public abstract IEnumerable <DateTime> GetForYear(Holiday holiday, int year);
 public abstract IEnumerable<DateTime> GetForYear(Holiday holiday, int year);