Comment vérifier si un DateTime est supérieur à l'autre en C #


105

J'ai deux DateTimeobjets: StartDateet EndDate. Je veux m'assurer que StartDatec'est avant EndDate. Comment cela se fait-il en C #?

Réponses:


210
if (StartDate < EndDate)
   // code

si tu veux juste les dates et non l'heure

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

27
if(StartDate < EndDate)
{}

DateTime prend en charge les opérateurs de comparaison normaux.



23

Vous pouvez utiliser les opérateurs surchargés <ou>.

Par exemple:

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

C'est probablement trop tard, mais pour bénéficier à d'autres personnes qui pourraient tomber sur cela, j'ai utilisé une méthode d'extension pour cela en utilisant IComparablecomme ceci:

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

L'utilisation de cette méthode d'extension avec IComparablerend cette méthode plus générique et la rend utilisable avec une grande variété de types de données et pas seulement des dates.

Vous l'utiliseriez comme ceci:

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

J'avais la même exigence, mais en utilisant la réponse acceptée, elle ne remplissait pas tous mes tests unitaires. Le problème pour moi est lorsque vous avez un nouvel objet, avec des dates de début et de fin et que vous devez définir la date de début (à ce stade, votre date de fin a la valeur de date minimale de 01/01/0001) - cette solution a tout réussi mes tests unitaires:

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

Il manque le cas limite où les dates de début et de fin peuvent être le 01/01/0001, mais cela ne m'inquiète pas.


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

0

Je voudrais montrer que si vous convertissez en .Date, vous n'avez pas à vous soucier des heures / minutes / secondes, 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);
    }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.