Jak sprawdzić, czy jeden DateTime jest większy niż drugi w C #


107

Mam dwa DateTimeobiekty: StartDatei EndDate. Chcę się upewnić, że StartDatejest wcześniej EndDate. Jak to się robi w C #?

Odpowiedzi:


212
if (StartDate < EndDate)
   // code

jeśli chcesz tylko daty, a nie godzinę

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



23

Możesz użyć przeciążonych operatorów <lub>.

Na przykład:

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


6

Prawdopodobnie jest już za późno, ale aby przynieść korzyści innym osobom, które mogą się na to natknąć, użyłem metody rozszerzającej, używając w IComparableten sposób:

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

Użycie tej metody rozszerzenia IComparablesprawia, że ​​ta metoda jest bardziej ogólna i nadaje się do użytku z szeroką gamą typów danych, a nie tylko dat.

Używałbyś tego w ten sposób:

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

Miałem to samo wymaganie, ale używając zaakceptowanej odpowiedzi, nie spełniło ono wszystkich moich testów jednostkowych. Problem dla mnie polega na tym, że masz nowy obiekt z datami rozpoczęcia i zakończenia i musisz ustawić datę rozpoczęcia (na tym etapie Twoja data zakończenia ma minimalną wartość 01/01/0001) - to rozwiązanie przeszło wszystko moje testy jednostkowe:

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

Pomija przypadek skrajny, w którym daty rozpoczęcia i zakończenia mogą być 01/01/0001, ale nie martwię się tym.



0

Chciałbym pokazać, że jeśli przekonwertujesz do .Date, nie musisz martwić się o godziny / minuty / sekundy itp .:

    [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);
    }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.