2008-09-18 4 views
75

Ich habe zwei DateTime Objekte: StartDate und EndDate. Ich möchte sicherstellen, dass StartDate vor EndDate ist. Wie wird das in C# gemacht?Wie überprüft man, ob eine DateTime später ist als eine andere in C#

+0

Werden die Antworten nicht sofort angezeigt? Weil ich die Seite aktualisiert habe, um sicherzustellen, dass niemand anders geantwortet hat. Aber nachdem ich meine Antwort eingegeben habe, bam 7 andere. –

+2

@toast, ich denke, dass acht Leute ungefähr zur selben Zeit antworteten. –

Antwort

147
if (StartDate < EndDate) 
    // code 

, wenn Sie nur die Daten wollen, und nicht die Zeit

if (StartDate.Date < EndDate.Date) 
    // code 
22
if(StartDate < EndDate) 
{} 

DateTime unterstützt normale Vergleichsoperatoren.

17
if(dateTimeA > dateTimeB) Console.WriteLine("Do your own homework"); 
5

Check out DateTime.Compare Methode

6
StartDate < EndDate 
19

können Sie verwenden, um die überlasteten < oder> Betreiber .

Zum Beispiel:

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

Wow, extremes Grabgraben. – recursive

+0

Viel stärker jetzt :) –

7
if (StartDate>=EndDate) 
{ 
    throw new InvalidOperationException("Ack! StartDate is not before EndDate!"); 
} 
2
 if (new DateTime(5000) > new DateTime(1000)) 
     { 
      Console.WriteLine("i win"); 
     } 
3

hatte ich die gleiche Forderung, aber wenn die akzeptierte Antwort mit, sie habe nicht alle meine Unit-Tests erfüllen. Das Problem für mich ist, wenn Sie ein neues Objekt mit Start- und Enddatum haben und Sie das Startdatum festlegen müssen (zu diesem Zeitpunkt hat Ihr Enddatum den Mindestdatumswert von 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."); 
      } 
     } 
    } 

er den Rand Fall nicht entgehen lassen, wo beide Start- und Enddaten 01.01.0001 sein können, aber ich bin darüber nicht besorgt.

2

Dies ist wahrscheinlich zu spät ist, aber auch andere Menschen zugute kommen, die auf diesem stolpern könnten, hat er eine zusätzliche Methode, so zu diesen mit IComparable zu tun:

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

mit IComparable diese Erweiterung Methode macht diese Methode generischer und macht es mit einer Vielzahl von Datentypen und nicht nur mit Daten verwendbar.

Sie würde 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 
} 
0

Ich möchte, dass zeigen, wenn Sie konvertieren .Date, dass Sie kümmern müssen nicht über Stunden/Minuten/Sekunden etc:

[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); 
    } 
Verwandte Themen