Как проверить, больше ли один DateTime, чем другой в C #


107

У меня есть два DateTimeобъекта: StartDateи EndDate. Я хочу убедиться, что StartDateэто раньше EndDate. Как это делается в C #?

Ответы:





23

Вы можете использовать перегруженные операторы <или>.

Например:

DateTime d1 = new DateTime(2008, 1, 1);
DateTime d2 = new DateTime(2008, 1, 2);
if (d1 < d2) { ...



6

Вероятно, это слишком поздно, но, чтобы помочь другим людям, которые могут наткнуться на это, я использовал метод расширения, который сделал это, 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
}


3

У меня было такое же требование, но при использовании принятого ответа он не выполнил все мои модульные тесты. Для меня проблема заключается в том, что у вас есть новый объект с датами начала и окончания, и вы должны установить дату начала (на этом этапе ваша дата окончания имеет минимальное значение даты 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, но меня это не беспокоит.



0

Я хотел бы продемонстрировать, что если вы конвертируете в .Date, вам не нужно беспокоиться о часах / минутах / секундах и т. Д .:

    [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);
    }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.