web-dev-qa-db-fra.com

Comparaison de DateTime Nullable?

Vous recherchez un meilleur moyen de comparer une heure de date nullable par rapport à ce qui suit:

Aucune suggestion?

// myobject.ExpireDatetime is of DateTime?
//
if (!myobject.ExpireDateTime.IsNull() && DateTime.Compare((DateTime)myobject.ExpireDateTime, DateTime.Now.ToUniversalTime()) < 0)
{ //error! }    

Édité: Désolé pour la confusion ... myobject.ExpireDatetime est de type DateTime.

22
JaJ

Votre question n’est pas tout à fait claire pour moi, mais si nous avons

DateTime? ExpireDateTime;  // could be a variable or a property

c'est bien de dire juste

if (ExpireDateTime < DateTime.UtcNow)
{
  ...
}

Ce sera OK si ExpireDateTime est null (HasValue est false). Certains développeurs inexpérimentés auront du mal à comprendre les opérateurs levés , alors pour que ce soit plus clair, vous pouvez écrire

if (ExpireDateTime < (DateTime?)DateTime.UtcNow)
{
  ...
}

C'est la même chose, mais plus facile à lire et à comprendre.

Never write .Value si le nullable peut être null, bien sûr. Vous obtiendrez une InvalidOperationException"objet Nullable doit avoir une valeur" si vous le faites.

29
Jeppe Stig Nielsen

Je vous recommanderais d'utiliser ce qui suit:

int y = Nullable.Compare<DateTime>(DateTime.UtcNow, x); 

// x is the nullable date time object.
// y will be '-1' if x is greater than DateTime.UtcNow
17
labroo

Utilisez la propriété Value de la propriété nullable:

objet.ExpireDateTime.Value

if (!object.ExpireDateTime.IsNull() 
    && DateTime.Compare(objet.ExpireDateTime.Value, 
                        DateTime.Now.ToUniversalTime()) < 0)
{ 
}    
1
Oded

Si ExpireDateTime est un Nullable<DateTime>i, vous obtiendrez ce qui suit:

if (ExpireDateTime.HasValue && ExpireDateTime < DateTime.Now.ToUniversalTime())
{ 
}
1
Rango

Le compilateur lève les variables et génère le code pour rechercher les valeurs NULL.

> new DateTime?()
null
> DateTime.Now > null
false
> DateTime.Now < null
false

> new int?()
null
> 10 >= null
false
> 10 =< null
false
> 10 == null
false
> 10 != null
true

Sachant cela, vous pouvez écrire un code simple.

// d is a DateTime? 
DateTime now = DateTime.Now;

bool after = d > now;
bool before = d < now;
bool today = d?.Date == now.Date;

Si d est null, tout sera faux, sinon cela fonctionnera comme une comparaison DateTime normale.

0
Patrick