Cómo verificar si un DateTime es mayor que el otro en C #


105

Tengo dos DateTimeobjetos: StartDatey EndDate. Quiero asegurarme de que StartDatesea ​​antes EndDate. ¿Cómo se hace esto en C #?

Respuestas:


210
if (StartDate < EndDate)
   // code

si solo quieres las fechas y no la hora

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

27
if(StartDate < EndDate)
{}

DateTime admite operadores de comparación normales.



23

Puede utilizar los operadores <o> sobrecargados.

Por ejemplo:

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

Esto probablemente sea demasiado tarde, pero para beneficiar a otras personas que podrían tropezar con esto, utilicé un método de extensión para hacer esto usando IComparableasí:

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 IComparablehace que este método sea más genérico y lo hace utilizable con una amplia variedad de tipos de datos y no solo con fechas.

Lo usarías así:

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

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

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

Se pierde el caso límite donde las fechas de inicio y finalización pueden ser 01/01/0001, pero eso no me preocupa.


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

0

Me gustaría demostrar que si convierte a .Date, no necesita preocuparse por 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);
    }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.