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.
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.
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
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)
{
}
Si ExpireDateTime
est un Nullable<DateTime>
i, vous obtiendrez ce qui suit:
if (ExpireDateTime.HasValue && ExpireDateTime < DateTime.Now.ToUniversalTime())
{
}
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.