Як перевірити, чи один DateTime більше, ніж інший у C #


105

У мене два DateTimeоб’єкти: StartDateі EndDate. Я хочу переконатися, що StartDateце раніше EndDate. Як це робиться в C #?

Відповіді:


210
if (StartDate < EndDate)
   // code

якщо ви хочете просто дати, а не час

if (StartDate.Date < EndDate.Date)
    // code



23

Ви можете використовувати перевантажені <або> оператори.

Наприклад:

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




5

Можливо, це занадто пізно, але для того, щоб принести користь іншим людям, які можуть натрапити на це, я використав метод розширення зробити це, використовуючи 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.2000) - це рішення все-таки пройшло все мій модульний тест:

    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.2001, але мене це не хвилює.



0

Я хотів би продемонструвати, що якщо ви переходите на. Дату, що вам не потрібно турбуватися про години / хвилини / секунди тощо:

    [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.