Есть ли между DateTime в С#? Я знаю, что я могу выполнить простую проверку с помощью if (a > date1 && a < date2)
, но я пытался найти метод Between
.
Есть ли BETWEEN DateTime в С# так же, как SQL?
Ответ 1
Нет функции Between
, но должно быть достаточно легко добавить один
public static bool Between(DateTime input, DateTime date1, DateTime date2)
{
return (input > date1 && input < date2);
}
Ответ 2
Зачем ограничивать только даты, используйте IComparable
интерфейс.
public static bool InclusiveBetween (this IComparable a, IComparable b, IComparable c)
{
return a.CompareTo(b) >= 0 && a.CompareTo(c) <= 0;
}
public static bool ExclusiveBetween (this IComparable a, IComparable b, IComparable c)
{
return a.CompareTo(b) > 0 && a.CompareTo(c) < 0;
}
public static bool SqlBetween (this IComparable a, IComparable b, IComparable c)
{
return a.InclusiveBetween(b, c);
}
Ответ 3
Нет, нет.
Ответ 4
FWIW, BETWEEN является инклюзивным, а не эксклюзивным WRT к его границам. Во всяком случае, здесь вы идете:
public static bool Between(this DateTime instant, DateTime dtFrom , DateTime dtThru )
{
if (dtFrom > dtThru) throw new ArgumentException( "dtFrom may not be after dtThru", "dtFrom" );
bool isBetween = ( instant >= dtFrom && instant <= dtThru );
return isBetween;
}
Ответ 5
Нет, но если вы выполняете форматирование числовой строки в Code Complete, исходный код выглядит проще:
if((lowDate < a) && (a < highDate))
Ответ 6
Вы можете добавить метод расширения:
public static Boolean Between(this DateTime input, DateTime minDate, DateTime maxDate)
{
// SQL takes limit in !
return input >= minDate && input <= maxDate;
}
Ответ 7
На основе ответа @richardschneider мое решение добавляет тип граничного диапазона в качестве параметра.
public enum RangeBoundaryType
{
[Description("Exclusive")]
Exclusive,
[Description("Inclusive on both boundaries")]
Inclusive,
[Description("Inclusive on only the lower boundary")]
InclusiveLowerBoundaryOnly,
[Description("Inclusive on only the upper boundary")]
InclusiveUpperBoundaryOnly
}
public static bool Between(this IComparable value, IComparable comparator0, IComparable comparator1, RangeBoundaryType rangeBoundary)
{
switch (rangeBoundary)
{
case RangeBoundaryType.Exclusive:
return (value.CompareTo(comparator0) > 0 && value.CompareTo(comparator1) < 0);
case RangeBoundaryType.Inclusive:
return (value.CompareTo(comparator0) >= 0 && value.CompareTo(comparator1) <= 0);
case RangeBoundaryType.InclusiveLowerBoundaryOnly:
return (value.CompareTo(comparator0) >= 0 && value.CompareTo(comparator1) < 0);
case RangeBoundaryType.InclusiveUpperBoundaryOnly:
return (value.CompareTo(comparator0) > 0 && value.CompareTo(comparator1) <= 0);
default:
return false;
}
}
Ответ 8
Я использую нечто похожее на Ричард Шнайдер (универсальный между ними) и ответ Гэри Пендлбери (упрощенная конфигурируемая граница включение)
public static bool Between(this IComparable value, IComparable lowerBoundary, IComparable upperBoundary,
bool includeLowerBoundary=true, bool includeUpperBoundary=true)
{
var lower = value.CompareTo(lowerBoundary);
var upper = value.CompareTo(upperBoundary);
return (lower > 0 || (includeLowerBoundary && lower == 0)) &&
(upper < 0 || (includeUpperBoundary && upper == 0));
}
Ответ 9
Этот способ выполняется быстро и параметры обратимы:
public static bool BetweenInclusive(this DateTime value, DateTime a, DateTime b)
{
return ((a <= value) && (value <= b)) || ((b <= value) && (value <= a));
}