public DateTime GetNext(DateTime value)
        {
            var minute = value.Minute;
            var hour   = value.Hour;
            var day    = value.Day;
            var month  = value.Month;
            var year   = value.Year;

            if (minuteRule.NextOrReset(minute, out minute))
            {
                hour++;
            }

            if (!hourRule.Contains(hour))
            {
                if (hourRule.NextOrReset(hour, out hour))
                {
                    day++;
                }

                minute = minuteRule.First();
            }

            if (!dayRule.Contains(day))
            {
                if (dayRule.NextOrReset(day, out day))
                {
                    month++;
                }

                minute = minuteRule.First();
                hour   = hourRule.First();
            }

            if (!monthRule.Contains(month))
            {
                if (monthRule.NextOrReset(month, out month))
                {
                    year++;
                }

                minute = minuteRule.First();
                hour   = hourRule.First();
                day    = dayRule.First();
            }

            return(new DateTime(year, month, day, hour, minute, 0));
        }