public static DateTime FirstXDay(this DateTime date, int xday = 1)
        {
            var firstDay = date.FirstDayOfMonth();

            DateTime result = new DateTime();
            int      count  = 0;

            for (DateTime day = firstDay; count < 7; day = day.AddDays(1))
            {
                if (OffDayProvider.IsXday(day, xday))
                {
                    //check if xday is before currentday try for next month
                    if (day <= date)
                    {
                        day   = date.AddMonths(1).FirstDayOfMonth().AddDays(-1);
                        count = 0;
                        continue;
                    }
                    result = day;
                    break;
                }
                count++;
            }
            return(result);
        }
        public static DateTime NthWeeksXDay(this DateTime date, int xday = 1, int week = 1)
        {
            var      firstDay   = date.FirstDayOfMonth();
            DateTime nthWeekEnd = new DateTime();
            int      count      = 0;

            for (DateTime day = firstDay.AddDays(7 * (week - 1)); count < 7; day = day.AddDays(1))
            {
                if (OffDayProvider.IsEndOfWeek(day))
                {
                    nthWeekEnd = day;
                    break;
                }
                count++;
            }

            var nthXDay = date.NthXDay(xday, week);

            if (nthXDay > nthWeekEnd && week == 1)
            {
                throw new Exception("NoSuchDateException");
            }
            else if (nthXDay > nthWeekEnd)
            {
                nthXDay = nthXDay.AddDays(-7);
            }
            return(nthXDay);
        }
        public static DateTime LastXDay(this DateTime date, int xday = 1)
        {
            var      lastDay = date.LastDayOfMonth();
            DateTime result  = new DateTime();
            int      count   = 0;

            for (DateTime day = lastDay; count < 7; day = day.AddDays(-1))
            {
                if (OffDayProvider.IsXday(day, xday))
                {
                    result = day;
                    break;
                }
                count++;
            }
            return(result);
        }
        public static DateTime WorkingDay(this DateTime date, bool first = true)
        {
            var result = new DateTime();
            var count  = 1;

            for (var day = date; count <= 3; day = day.AddDays(first ? 1 : -1))
            {
                if (!OffDayProvider.IsOffDay(day))
                {
                    result = day;
                    break;
                }

                count++;
            }
            return(result);
        }