, Он также неизменен, как и следовало ожидать от типов, которые расширяют функциональность других типов значений, таких как

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

// The date range
DateTime startDate;
DateTime endDate;

DateTime dateToCheck;

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

Заранее спасибо.

 Polyfun24 янв. 2011 г., 12:50
Так что же умнее, чем простое решение?
 Tomas Jansson24 янв. 2011 г., 12:50
Разумнее, чем просто проверять дату между этими датами?

Ответы на вопрос(6)

Обычно я создаюДиапазон Фаулера реализация для таких вещей.

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)
 Kadaj20 окт. 2016 г., 16:51
Чувак, это такое хорошее решение, оно даже работает с LINQ. Примерно так: var valueFromVacationsList = vacationBookingsForThisMonth.FirstOrDefault (s => (s.Id == currentUser.Id) && new DateRange (s.StartDateTime, s.EndDateTime) .Include (itemDate));
 Adrian Hum08 янв. 2016 г., 04:35
Просто глупое наблюдение, разве конструктор не должен гарантировать, что начало меньше конца, если это не так, это нарушит логику ... особенно для включений (диапазон IRange <DateTime>)

Исходя из СергеяответЯ думаю, что эта более общая версия более соответствует Fowler'sRange идея, и решает некоторые проблемы с этим ответом, такие как возможность иметьIncludes методы в общем классе путем ограниченияT какIComparable<T>, Он также неизменен, как и следовало ожидать от типов, которые расширяют функциональность других типов значений, таких какDateTime.

public struct Range<T> where T : IComparable<T>
{
    public Range(T start, T end)
    {
        Start = start;
        End = end;
    }

    public T Start { get; }

    public T End { get; }

    public bool Includes(T value) => Start.CompareTo(value) <= 0 && End.CompareTo(value) >= 0;

    public bool Includes(Range<T> range) => Start.CompareTo(range.Start) <= 0 && End.CompareTo(range.End) >= 0;
}

чтобы сделать его немного более читабельным:

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

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

dateToCheck.InRange(startDate, endDate)
 Andrew08 мая 2011 г., 16:51
хороший подход, хотя я бы использовалIsInRange() как имя функции

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

return (dateTocheck >= startDate && dateToCheck <= endDate);
Решение Вопроса

return dateToCheck >= startDate && dateToCheck < endDate;

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

DateTime это несколько странный тип с точки зрения часовых поясов. Это может быть UTC, это может быть "местный", это может быть неоднозначным. Убедитесь, что вы сравниваете яблоки с яблоками.Подумайте, должны ли ваши начальные и конечные точки быть инклюзивными или эксклюзивными. Я заставил код выше рассматривать его как включающую нижнюю границу и исключительную верхнюю границу.
 CodesInChaos24 янв. 2011 г., 12:57
Да. Убедиться, чтоDateTimes, вы сравниваете, имеют одинаковый вид (UTC / Local). С разными видами будет сравниваться необработанное время, а не преобразовывать оба в общий вид.
 Jon Skeet10 июн. 2014 г., 21:07
@MauricioMorales: это зависит; Некоторым людям легче читать «изменяющийся бит» (дата, которую нужно проверить), находясь последовательно с левой стороны. Это то, что я склонен делать. Я также вижу преимущества подхода «в хронологическом порядке», но я думаю, что лично я предпочел бы то, как я это понял.
 Mauricio Morales10 июн. 2014 г., 21:06
return startDate <= dateToCheck && dateToCheck < endDate кажется немного более читабельным.

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

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

 BoundForGlory01 июн. 2016 г., 19:54
Я согласен. Я не могу поверить, что .NET не имеет встроенных математических сборок даты. Спасибо, что поделились библиотекой
 PoorInRichfield12 нояб. 2018 г., 15:53
Я использовал библиотеку «Период времени» для проекта, который создавал графики, когда электронные знаки должны были отображать изображения, и это экономило время. Черт возьми, я не могу представить, что завершил этот проект без библиотеки Time Period.

Ваш ответ на вопрос