public static List <DateRange> SubtractDates(this DateRange firstDateRange, DateRange secondDateRange, bool shouldExcludeBounds)
        {
            DateRange firstMidnightDateRange  = firstDateRange.AsMidnightDateRange();
            DateRange secondMidnightDateRange = secondDateRange.AsMidnightDateRange();

            if (secondMidnightDateRange.Intersects(firstMidnightDateRange, shouldExcludeBounds))
            {
                var resultDateRanges = new List <DateRange>();

                // подневная тарификация
                if (shouldExcludeBounds)
                {
                    if (firstMidnightDateRange.StartDate < secondMidnightDateRange.StartDate)
                    {
                        resultDateRanges.Add(new DateRange(firstMidnightDateRange.StartDate, secondMidnightDateRange.StartDate.AddDays(-1)));
                    }

                    if (firstMidnightDateRange.EndDate > secondMidnightDateRange.EndDate)
                    {
                        resultDateRanges.Add(new DateRange(secondMidnightDateRange.EndDate.AddDays(1), firstMidnightDateRange.EndDate));
                    }

                    return(resultDateRanges);
                }

                if (firstMidnightDateRange.StartDate < secondMidnightDateRange.StartDate)
                {
                    resultDateRanges.Add(new DateRange(firstMidnightDateRange.StartDate, secondMidnightDateRange.StartDate));
                }

                if (firstMidnightDateRange.EndDate > secondMidnightDateRange.EndDate)
                {
                    resultDateRanges.Add(new DateRange(secondMidnightDateRange.EndDate, firstMidnightDateRange.EndDate));
                }

                return(resultDateRanges);
            }

            return(new List <DateRange> {
                new DateRange(firstMidnightDateRange.StartDate, firstMidnightDateRange.EndDate)
            });
        }