Как проверить, если один DateTime позже, чем другой в C#
у меня есть два DateTime
объекты: StartDate
и EndDate
. Я хочу убедиться StartDate
до EndDate
. Как это делается в C#?
11 ответов:
if (StartDate < EndDate) // code
Если вы просто хотите даты, а не время
if (StartDate.Date < EndDate.Date) // code
можно использовать перегруженные операторы .
например:
DateTime d1 = new DateTime(2008, 1, 1); DateTime d2 = new DateTime(2008, 1, 2); if (d1 < d2) { ...
if (StartDate>=EndDate) { throw new InvalidOperationException("Ack! StartDate is not before EndDate!"); }
это, вероятно, слишком поздно, но чтобы помочь другим людям, которые могут наткнуться на это, я использовал метод расширения сделать это с помощью
IComparable
такой:public static class BetweenExtension { public static bool IsBetween<T>(this T value, T min, T max) where T : IComparable { return (min.CompareTo(value) <= 0) && (value.CompareTo(max) <= 0); } }
используя этот метод расширения с
IComparable
делает этот метод более универсальным и позволяет использовать его с широким спектром типов данных, а не только даты.вы бы использовали его так:
DateTime start = new DateTime(2015,1,1); DateTime end = new DateTime(2015,12,31); DateTime now = new DateTime(2015,8,20); if(now.IsBetween(start, end)) { //Your code here }
У меня было такое же требование, но при использовании принятого ответа он не выполнил все мои модульные тесты. Проблема для меня, когда у вас есть новый объект, с датами начала и окончания, и вы должны установить дату начала ( на этом этапе ваша дата окончания имеет минимальное значение даты 01/01/0001) - это решение прошло все мои модульные тесты:
public DateTime Start { get { return _start; } set { if (_end.Equals(DateTime.MinValue)) { _start = value; } else if (value.Date < _end.Date) { _start = value; } else { throw new ArgumentException("Start date must be before the End date."); } } } public DateTime End { get { return _end; } set { if (_start.Equals(DateTime.MinValue)) { _end = value; } else if (value.Date > _start.Date) { _end = value; } else { throw new ArgumentException("End date must be after the Start date."); } } }
он пропускает крайний случай, когда даты начала и окончания могут быть 01/01/0001, но меня это не беспокоит.
Я хотел бы продемонстрировать это, если вы конвертируете .Дата, когда вам не нужно беспокоиться о часах / минутах / секундах и т. д.:
[Test] public void ConvertToDateWillHaveTwoDatesEqual() { DateTime d1 = new DateTime(2008, 1, 1); DateTime d2 = new DateTime(2008, 1, 2); Assert.IsTrue(d1 < d2); DateTime d3 = new DateTime(2008, 1, 1,7,0,0); DateTime d4 = new DateTime(2008, 1, 1,10,0,0); Assert.IsTrue(d3 < d4); Assert.IsFalse(d3.Date < d4.Date); }