Подтвердить что ты не робот

Как узнать, является ли DateTime между DateRange в С#

Мне нужно знать, существует ли дата между DateRange. У меня три даты:

// The date range
DateTime startDate;
DateTime endDate;

DateTime dateToCheck;

Простое решение делает сравнение, но есть ли более разумный способ сделать это?

Спасибо заранее.

4b9b3361

Ответ 1

Нет, простое сравнение выглядит хорошо для меня:

return dateToCheck >= startDate && dateToCheck < endDate;

О чем подумать:

  • DateTime является несколько нечетным типом по часовым поясам. Это может быть UTC, это может быть "локально", это может быть неоднозначно. Убедитесь, что вы сравниваете яблоки с яблоками.
  • Учитывайте, должны ли ваши начальные и конечные пункты включать или исключать. Я сделал код выше, рассматривая его как инклюзивную нижнюю границу и исключительную верхнюю границу.

Ответ 2

Обычно я создаю Fowler Range для таких вещей.

public interface IRange<T>
{
    T Start { get; }
    T End { get; }
    bool Includes(T value);
    bool Includes(IRange<T> range);
}

public class DateRange : IRange<DateTime>         
{
    public DateRange(DateTime start, DateTime end)
    {
        Start = start;
        End = end;
    }

    public DateTime Start { get; private set; }
    public DateTime End { get; private set; }

    public bool Includes(DateTime value)
    {
        return (Start <= value) && (value <= End);
    }

    public bool Includes(IRange<DateTime> range)
    {
        return (Start <= range.Start) && (range.End <= End);
    }
}

Использование довольно просто:

DateRange range = new DateRange(startDate, endDate);
range.Includes(date)

Ответ 3

Вы можете использовать методы расширения, чтобы сделать его более читаемым:

public static class DateTimeExtensions
{
    public static bool InRange(this DateTime dateToCheck, DateTime startDate, DateTime endDate)
    {
        return dateToCheck >= startDate && dateToCheck < endDate;
    }
}

Теперь вы можете написать:

dateToCheck.InRange(startDate, endDate)

Ответ 4

Вы можете использовать:

return (dateTocheck >= startDate && dateToCheck <= endDate);

Ответ 5

Ive нашел следующую библиотеку наиболее полезной при выполнении какой-либо математики даты. Я все еще удивляюсь тому, что это часть инфраструктуры .Net.

http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET