2008-09-18 11 views
75

Tengo dos objetos DateTime: StartDate y EndDate. Quiero asegurarme de que StartDate esté antes de EndDate. ¿Cómo se hace esto en C#?Cómo comprobar si un DateTime es posterior a otro en C#

+0

¿Las respuestas no se muestran de inmediato? Porque actualicé la página para asegurarme de que nadie más había respondido. Pero después de poner mi respuesta, bam 7 otros. –

+2

@toast, creo que ocho personas respondieron aproximadamente al mismo tiempo. –

Respuesta

147
if (StartDate < EndDate) 
    // code 

si lo que desea la fecha, y no el tiempo

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

DateTime admite operadores de comparación normales.

17
if(dateTimeA > dateTimeB) Console.WriteLine("Do your own homework"); 
6
StartDate < EndDate 
19

Puede utilizar los sobrecargados o <> operadores .

Por ejemplo:

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

Guau, excavación de tumbas extremas. – recursive

+0

Mucho más fuerte ahora :) –

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

que tenían el mismo requisito, pero cuando se utiliza la respuesta aceptada, que no cumplía con todas mis pruebas unitarias. El problema para mí es cuando tienes un objeto nuevo, con fechas de inicio y finalización y tienes que establecer la fecha de inicio (en esta etapa tu fecha de finalización tiene el valor de fecha mínimo 01/01/0001) - esta solución pasó todo mis pruebas de unidad:

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

lo hace se pierda el caso extremo en que tanto las fechas de inicio y pueden ser 01/01/0001, pero no estoy preocupado por eso.

2

Ésta es probablemente demasiado tarde, pero en beneficio de otras personas que podrían tropezar con esto, he utilizado un método de extensión hacer para esto utilizando IComparable así:

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

El uso de este método de extensión con IComparable hace que este método más genérico y lo hace utilizable con una amplia variedad de tipos de datos y no solo fechas.

Se podría utilizar de esta manera:

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

me gustaría demostrar que si convierte a .Date que no es necesario preocuparse por las horas/minutos/segundos, 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); 
    } 
Cuestiones relacionadas