DateTimeの「null」値


273

何度も検索しましたが、解決策が見つかりませんでした。初期化されていない値(nullと同等)を含むことができるはずのDateTimeをどのように処理しますか?DateTimeプロパティ値が設定されているかどうかにかかわらず、クラスがあります。プロパティホルダーをDateTime.MinValueに初期化することを考えていました。これはごく一般的な質問だと思いますが、どうすればよいですか。

回答:


420

通常のDateTimeの場合、それらをまったく初期化しないと、それらはと一致DateTime.MinValueします。これは、それが参照型ではなく値型だからです。

次のように、null許容のDateTimeを使用することもできます。

DateTime? MyNullableDate;

または長い形式:

Nullable<DateTime> MyNullableDate;

そして最後に、任意のタイプのデフォルトを参照する組み込みの方法があります。これはnull参照型の場合は戻りますが、DateTimeの例の場合は次のものと同じ結果を返しDateTime.MinValueます。

default(DateTime)

または、C#の最新バージョンでは、

default

8
それを使用する方法の例を提供すると非常に役立ちます。データベースのDateTime(DBNullの場合もある)をnull可能なDateTimeにどのように割り当てますか?
kirk.burleson 2010

9
それはあなたがそれらを初期化し、ヌルでない場合、それらが割り当てられていることに注意することも良いことだDateTime.MinValueとしても
ジェフLaFay

2
別の質問のように見える@ kirk.burleson。
CompuChip 2016

あなたが必要ですMyNullableDate=date; 、それを設定するためにMyDate = MyNullableDate.Value;、そこから読み取るように、そしてif(MyNullableDate.HasValue)それがnullであるかどうかを確認するために
satibel

回答の「最終的に」少し明確にするために-Nullable <T>は参照型を作成するため、Nullable <DateTime>(DateTime?)のデフォルトはnullです。
ryanwebjackson 2017

88

.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


1
以前のバージョンの.NETでもnull許容型を使用できます。3.0は必要ありません。
stephenbayer 2008年

1
.NET 2.0に含まれていますよね??構文は3.5でVB.NETに追加されましたが、2.0以降はC#で使用されていると思います。
David Mohundro 2008年

1
null可能型は.Net 2.0で利用できます。C#には省略形がありますか?2.0からの表記。VB.Netだけに省略形がありませんでしたか?2.0ではNullable(Of DateTime)を使用できます
Mendelt

最後のスニペットについては、DateTime dt2 = dt ?? DateTime.MinValue;
Joel Coehoorn、2008年

私は使用しますdt.GetValueOrDefault()-これは最も効率的なオプションです。
CompuChip

37

日付時刻?MyDateTime {get; set;}

MyDateTime = (dr["f1"] == DBNull.Value) ? (DateTime?)null : ((DateTime)dr["f1"]);

1
これは、パスnullが機能しないことを発見するのに役立ちました。する必要があります(DateTime?)null
Inphinite Phractals

33

以下の方法も機能します

myClass.PublishDate = toPublish ? DateTime.Now : (DateTime?)null;

プロパティPublishDateはDateTimeでなければならないことに注意してください。



8

それは一方で、指摘する価値があるDateTime変数をすることはできませんnull、それはまだと比較することができ、nullコンパイラエラーなし:

DateTime date;
...
if(date == null) // <-- will never be 'true'
  ...

6

null許容クラスを使用できます。

DateTime? date = new DateTime?();

これは、null可能でないをインスタンス化する場合とは異なる動作を提供することに注意してくださいDateTime。前述のように、nullになりnew DateTime()ますがDateTime.Min、実質的にはを提供new DateTime?()します。
-Vitoc


6

DateTimeをNullableに設定できます。デフォルトでは、DateTimeはnullにできません。いくつかの方法でnull可能にすることができます。タイプDateTimeの後に疑問符を使用しますか?myTimeまたはジェネリックスタイルNullableを使用します。

DateTime? nullDate = null;

または

DateTime? nullDate;

5

時間は常にに設定しましたDateTime.MinValue。これにより、NullErrorExceptionが発生せず、設定されていないことがわかっている日付と比較できます。


8
つまり、「ここにはDateTimeが本当に必要」と「オプションです」の違いを見分けることができません。IMOでは、Nullable <DateTime>の方がはるかに優れています。
Jon Skeet、

?私は本当にあなたのコメントを受け取りません。ええ、DateTimeが現実から遠く離れていると、まるでそれがnullだったかのように見えます...
Patrick Desjardins

2
便利ですが、DateTime.MinValueを特別なケースの条件ではなく値として表示しています。将来的に問題が発生する可能性があります。Nullable <DateTime>を使用します。
スポールソン2008年

3
あなたは私の答えについて何かを逃していると思います、Spoulsonが何かを書いて、私は答えていました。パブリックメンバーについては、同じではなく、ご存知のとおりです。String.Emptyまたはnullのようなものです。String.Emptyはnullが間違っているよりも優れているためではなく、両方を実行できます。なんでも。
Patrick Desjardins、

1
私はこれについてDaokと一緒にいます。「本ごと」のアプローチではないかもしれませんが、NullReferenceExceptionを取得したり、扱いにくいNullable型を処理したりするよりも優れています。さらに、西暦1年1月1日の日付を実際に参照する必要があるアプリケーションはいくつありますか?
Jacobs Data Solutions、

4

注意してください-Nullableを使用する場合、DateTimeメンバーに直接アクセスできないため、Nullableは明らかに「純粋な」datetimeオブジェクトではなくなります。説明してみます。

Nullable <>を使用することで、基本的にはDateTimeをnullが可能なコンテナ(ジェネリックに感謝)でラップします。これは明らかにその目的です。このコンテナには、前述のDateTimeオブジェクトへのアクセスを提供する独自のプロパティを呼び出すことができます。正しいプロパティ(この場合はNullable.Value)を使用した後、標準のDateTimeメンバー、プロパティなどにアクセスできます。

つまり、DateTimeオブジェクトにアクセスするための最良の方法に関して問題が思い浮かびます。いくつかの方法があります。1番はFARが最高で、2番は「理由」です。

  1. Nullable.Valueプロパティを使用して、

    DateTime date = myNullableObject.Value.ToUniversalTime(); //Works

    DateTime date = myNullableObject.ToUniversalTime(); //Not a datetime object, fails

  2. Convert.ToDateTime()を使用してnull許容オブジェクトをdatetimeに変換し、

    DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime(); //works but why...

現時点では答えは十分に文書化されていますが、Nullableの使用法はおそらく投稿する価値があったと思います。同意しない場合は申し訳ありません。

編集:3番目のオプションは少し限定的で、ケースに依存していたため削除しました。


2

誰もがあなたに答えをすでに与えていますが、日付時刻を関数に簡単に渡すことができる方法について説明します

[エラー:system.datetimeを変換できませんか?system.datetimeへ]

DateTime? dt = null;
DateTime dte = Convert.ToDateTime(dt);

これで、問題なく関数内でdteを渡すことができます。


1

nullを期待している場合は、次のようなものを使用できます。

var orderResults = Repository.GetOrders(id, (DateTime?)model.DateFrom, (DateTime?)model.DateTo)

リポジトリでは、null許容の日時を使用してください。

public Orders[] GetOrders(string id, DateTime? dateFrom, DateTime? dateTo){...}

1

Throws ArgumentNullExceptionの単体テストを実行しているときに、DateTimeのパラメーターとしてNullを指定する必要があるのと同じ問題がありました。私の場合、次のオプションを使用して機能しました。

Assert.Throws<ArgumentNullException>(()=>sut.StartingDate = DateTime.Parse(null));

0

日付/時刻データ型の性質上、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フィールドをとしてマークすることで、2番目のポイントを達成できnullableます。これ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#プログラマーです:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.