So überprüfen Sie, ob eine DateTime in C # größer als die andere ist


104

Ich habe zwei DateTimeObjekte: StartDateund EndDate. Ich möchte sicherstellen, dass StartDatees vorher ist EndDate. Wie geht das in C #?

Antworten:


208
if (StartDate < EndDate)
   // code

wenn Sie nur die Daten und nicht die Zeit wollen

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

27
if(StartDate < EndDate)
{}

DateTime unterstützt normale Vergleichsoperatoren.



23

Sie können die überladenen <oder> -Operatoren verwenden.

Beispielsweise:

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

8
if (StartDate>=EndDate)
{
    throw new InvalidOperationException("Ack!  StartDate is not before EndDate!");
}



5

Dies ist wahrscheinlich zu spät, aber um anderen Menschen zu helfen, die darüber stolpern könnten, habe ich eine Erweiterungsmethode verwendet, um dies folgendermaßen zu tun 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);
        }
    }

Durch die Verwendung dieser Erweiterungsmethode mit IComparablewird diese Methode allgemeiner und kann mit einer Vielzahl von Datentypen und nicht nur mit Datumsangaben verwendet werden.

Sie würden es so verwenden:

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

Ich hatte die gleiche Anforderung, aber als ich die akzeptierte Antwort verwendete, erfüllte sie nicht alle meine Komponententests. Das Problem für mich ist, wenn Sie ein neues Objekt mit Start- und Enddatum haben und das Startdatum festlegen müssen (zu diesem Zeitpunkt hat Ihr Enddatum den Mindestdatumwert vom 01.01.0001) - diese Lösung hat alle bestanden meine Unit-Tests:

    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.");
            }
        }
    }

Es fehlt der Randfall, in dem sowohl Start- als auch Enddatum 01/01/0001 sein können, aber ich mache mir darüber keine Sorgen.


2
        if (new DateTime(5000) > new DateTime(1000))
        {
            Console.WriteLine("i win");
        }

0

Ich möchte zeigen, dass Sie sich bei der Konvertierung in .Date keine Gedanken über Stunden / Minuten / Sekunden usw. machen müssen:

    [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);
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.