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) }); }