Пересечение промежутка времени в c # - PullRequest
8 голосов
/ 27 июля 2011

Допустим, у меня есть 2 диапазона дат.

Эти диапазоны дат могут быть представлены как промежутки времени.

Я хочу найти диапазон дат, который попадает в два интервала времени.

Range 1: 2/1/2011 - 8/1/2011 (timespan of 6 months)
Range 2: 5/2/2011 - 5/28/2011 (timespan of 26 days)

поэтому в этом случае пересечение будет 5/2 / 2011-5 / 28/2011, но диапазоны могут двигаться в любом направлении (или вообще не пересекаться, и в этом случае я бы хотел, чтобы результирующий промежуток времени составил быть длиной 0)

в конце мне нужны календарные даты начала / конца результирующего промежутка времени пересечения (не только тики / часы / дни и т. Д.)

Есть ли элегантный способ сделать это в c # 3.0?

UPDATE

Я взял код StriplingWarriors и создал из него метод ..

    private static DateRange GetIntersectionRange(DateRange range1, DateRange range2) {
        var iRange = new DateRange();
        iRange.From = range1.From < range2.From ? range2.From : range1.From;
        iRange.To = range1.To < range2.To ? range1.To : range2.To;
        if (iRange.From > iRange.To) iRange = null;
        return iRange;
    }

Ответы [ 2 ]

12 голосов
/ 27 июля 2011

Что-то вроде этого, возможно?

var range1 = new{start = DateTime.Parse("2/1/2011"), end = DateTime.Parse("8/1/2011")};
var range2 = new{start = DateTime.Parse("5/2/2011"), end = DateTime.Parse("5/28/2011")};
var iStart = range1.start < range2.start ? range2.start : range1.start;
var iEnd = range1.end < range2.end ? range1.end : range2.end;
var newRange = iStart < iEnd ? new{start = iStart, end = iEnd} : null;

Это должно вернуть null, если нет пересекающегося периода времени.

0 голосов
/ 27 июля 2011

Простой способ - вычесть время начала диапазона 1 со временем начала диапазона 2. Если интервал времени> 0, выберите диапазон 1 в качестве даты начала.

Сделайте то же самое для даты окончания диапазона. Но если промежуток времени> 0, выберите дату окончания диапазона 2.

Затем сравните результаты, если оба допустимых диапазона. Т.е. начало <конец. В противном случае нет допустимого диапазона. </p>

...