web-dev-qa-db-ja.com

null許容のDateTimeを比較しますか?

以下よりもNULL可能日時を比較するより良い方法を探しています。

助言がありますか?

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

編集:混乱して申し訳ありません... myobject.ExpireDatetimeはDateTime型です。

25
genxgeek

あなたの質問は私には明確ではありませんが、私たちが持っている場合

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

ただ言ってもいい

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

ExpireDateTimenullHasValueがfalse)の場合、これは問題ありません。経験の浅い開発者の中には 持ち上げられた演算子 を理解するのに苦労する人もいるでしょう。

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

同じですが、読みやすく、理解しやすいです。

Neverwrite .Valueもちろん、null許容値がnullである可能性がある場合。 InvalidOperationException "Nullable object must have a value"を取得します。

31

以下を使用することをお勧めします。

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
19
labroo

コンパイラー lifts 変数と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

これを知っていれば、簡単なコードを書くことができます。

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

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

Dがnullの場合、すべてがfalseになります。それ以外の場合、通常のDateTime比較のように機能します。

1
Patrick

Nullableの Value プロパティを使用します。

objet.ExpireDateTime.Value

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

ExpireDateTimeNullable<DateTime>iの場合、代わりに以下を実行します。

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