DateTime“ null”値
質問
よく検索しましたが、解決策が見つかりませんでした。初期化されていない値(nullに相当)を含むことができるはずのDateTimeをどのように処理しますか? DateTimeプロパティ値が設定されている場合と設定されていない場合があります。プロパティホルダーをDateTime.MinValueに初期化することを考えていたので、簡単に確認できました。これはよくある質問だと思いますが、どうすればいいですか?
解決
通常のDateTimesでは、まったく初期化しない場合、参照型ではなく値型であるため、 DateTime.MinValue
と一致します。
次のように、null許容のDateTimeを使用することもできます。
DateTime? MyNullableDate;
またはより長い形式:
Nullable<DateTime> MyNullableDate;
そして最後に、あらゆるタイプのデフォルトを参照するための組み込みの方法があります。これは、参照型に対して null
を返しますが、DateTimeの例では、 DateTime.MinValue
と同じものを返します:
default(DateTime)
他のヒント
.NET 2.0(またはそれ以降)を使用している場合は、null許容型を使用できます:
DateTime? dt = null;
または
Nullable<DateTime> dt = null;
その後:
dt = new DateTime();
また、次の方法で値を確認できます。
if (dt.HasValue)
{
// Do something with dt.Value
}
または次のように使用できます:
DateTime dt2 = dt ?? DateTime.MinValue;
ここで詳細を読むことができます:
http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx
DateTime? MyDateTime {get; set;}
MyDateTime = (dr["f1"] == DBNull.Value) ? (DateTime?)null : ((DateTime)dr["f1"]);
次の方法も同様に機能します
myClass.PublishDate = toPublish ? DateTime.Now : (DateTime?)null;
プロパティPublishDateはDateTimeである必要があることに注意してください
DateTime?
。 DateTime myDate
ではなくmyDate
null許容クラスを使用できます。
DateTime? date = new DateTime?();
これには、null許容のDateTimeを使用できます。
Nullable<DateTime> myDateTime;
または同じように書かれたもの:
DateTime? myDateTime;
時刻は常に DateTime.MinValue
に設定します。このようにして、NullErrorExceptionを取得せず、設定されていないことがわかっている日付と比較できます。
DateTime
変数を null
にすることはできませんが、コンパイラエラーなしで null
と比較できます。 :
DateTime date;
...
if(date == null) // <-- will never be 'true'
...
DateTimeをNullableに設定できます。デフォルトでは、DateTimeはnullを許可しません。いくつかの方法でNULL可能にすることができます。タイプDateTimeの後に疑問符を使用していますか? myTimeまたは汎用スタイルのNullableを使用します。 msdnにリンクをいくつか追加しました。
警告が表示されます-Nullableを使用する場合、明らかに「純粋な」datetimeオブジェクトではないため、DateTimeメンバーに直接アクセスできません。説明してみます。
Nullableを使用して&lt;&gt;基本的には、DateTimeをnull値を許可するコンテナ(ジェネリックに感謝)でラップしています-明らかにその目的です。このコンテナには、前述のDateTimeオブジェクトへのアクセスを提供する独自のプロパティがあります。正しいプロパティ(この場合はNullable.Value)を使用すると、標準のDateTimeメンバー、プロパティなどにアクセスできます
それで、DateTimeオブジェクトにアクセスするための最良の方法に関して問題が思い浮かびます。いくつかの方法があります。1番がFARによるもので、2番が "dude why"です。
-
Nullable.Valueプロパティの使用
DateTime date = myNullableObject.Value.ToUniversalTime(); //動作
DateTime date = myNullableObject.ToUniversalTime(); //日時オブジェクトではなく、失敗します
-
Convert.ToDateTime()を使用してNULL可能オブジェクトを日時に変換する、
DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime(); //動作しますが、なぜ...
この時点で答えは十分に文書化されていますが、Nullableの使用はおそらく投稿する価値があると思います。同意できない場合は申し訳ありません。
編集:3番目のオプションは、過度に具体的で大文字と小文字に依存していたため削除しました。
誰もがすでにあなたに答えを与えていますが、関数に日時を簡単に渡す方法について言及します
[エラー:system.datetimeを変換できませんか? system.datetimeへ]
DateTime? dt = null;
DateTime dte = Convert.ToDateTime(dt);
これで、問題なく関数内にdteを渡すことができます。
nullを期待している場合は、次のようなものを使用できます:
var orderResults = Repository.GetOrders(id, (DateTime?)model.DateFrom, (DateTime?)model.DateTo)
リポジトリでは、null対応の日時を使用します。
public Orders[] GetOrders(string id, DateTime? dateFrom, DateTime? dateTo){...}
Throws ArgumentNullExceptionの単体テストの実行中に、DateTimeのパラメーターとしてNullを指定する必要があるのと同じ問題がありました。私の場合、次のオプションを使用して動作しました。
Assert.Throws<ArgumentNullException>(()=>sut.StartingDate = DateTime.Parse(null));
日付/時刻データ型の性質上、 null
値を含めることはできません。つまり、値を含める必要があります。空にすることも何も含めることはできません。日付/時刻変数を nullable
としてマークすると、null値のみを割り当てることができます。だからあなたがやろうとしているのは2つのことの1つです(もっとあるかもしれませんが、私は2つしか考えられません):
-
値がない場合は、変数に最小の日付/時刻値を割り当てます。日付/時刻の最大値も割り当てることができます-どちらの方法もあなたに合っています。日付/時刻の値を確認するときは、サイト全体で一貫していることを確認してください。
min
またはmax
を使用することを決定し、それに従ってください。 -
日付/時刻変数を
nullable
としてマークします。このようにして、変数がない場合は、日付/時刻変数をnull
に設定できます。
例を使用して、最初のポイントを示してみましょう。 DateTime
変数タイプはnullに設定できません。値が必要です。この場合、値がない場合は DateTime
の最小値に設定します。
私のシナリオでは、 BlogPost
クラスがあります。さまざまなフィールド/プロパティがありますが、この例では2つだけを使用することにしました。 DatePublished
は、投稿がWebサイトに公開された日付であり、日付/時刻の値を含める必要があります。 DateModified
は投稿が変更されたときです。そのため、値を含める必要はありませんが、値を含めることができます。
public class BlogPost : Entity
{
public DateTime DateModified { get; set; }
public DateTime DatePublished { get; set; }
}
ADO.NET
を使用してデータベースからデータを取得する( DateTime.MinValue
に値がない場合):
BlogPost blogPost = new BlogPost();
blogPost.DateModified = sqlDataReader.IsDBNull(0) ? DateTime.MinValue : sqlDataReader.GetFieldValue<DateTime>(0);
blogPost.DatePublished = sqlDataReader.GetFieldValue<DateTime>(1);
DateModified
フィールドを nullable
としてマークすると、2番目のポイントを達成できます。値がない場合は、 null
に設定できます。
public DateTime? DateModified { get; set; }
ADO.NET
を使用してデータベースからデータを取得すると、上記の方法とは少し異なります(の代わりに
): null
を割り当てます) DateTime.MinValue
BlogPost blogPost = new BlogPost();
blogPost.DateModified = sqlDataReader.IsDBNull(0) ? (DateTime?)null : sqlDataReader.GetFieldValue<DateTime>(0);
blogPost.DatePublished = sqlDataReader.GetFieldValue<DateTime>(1);
これが混乱を解消するのに役立つことを願っています。私の回答が約8年後であることを考えると、おそらくあなたはたぶん今ではエキスパートのC#プログラマーでしょう:)