web-dev-qa-db-ja.com

DateTimeの "null"値

私はたくさん探していましたが、解決策を見つけることができませんでした。初期化されていない値(nullと同等)を含めることができるはずのDateTimeをどのように処理しますか? DateTimeプロパティの値が設定されているかどうかにかかわらず、クラスがあります。私はプロパティホルダーをDateTime.MinValueに初期化することを考えていました、そしてそれはそれから簡単にチェックされることができました。これはごくありふれた質問だと思いますが、どうしますか。

249
Mats

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

次のように、NULL可能なDateTimeを使用することもできます。

DateTime? MyNullableDate;

または長い形式:

Nullable<DateTime> MyNullableDate;

そして最後に、あらゆる型のデフォルトを参照する方法が組み込まれています。これは参照型に対してnullを返しますが、私たちのDateTimeの例ではDateTime.MinValueと同じ値を返します。

default(DateTime)
391
Joel Coehoorn

.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/ja-jp/library/b3h38hb0.aspx

81
Mark Ingram

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

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

次の方法でもうまくいく

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

プロパティPublishDateはDateTimeであるべきですか?

22
Aleksei

私は null許容型 を使うことを考えます。

DateTime? myDateの代わりにDateTime myDate

12
David Mohundro

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

DateTime? date = new DateTime?();
6
Aaron Smith

これにはNULL可能なDateTimeを使用できます。

Nullable<DateTime> myDateTime;

または同じことがこのように書かれています:

DateTime? myDateTime;
6
Patrik Svensson

私はいつもDateTime.MinValueに時間を設定します。こうすれば私はNullErrorExceptionを得ないし、私がそれが私が設定されていないのを知っている日付と比較することができる。

5

DateTime変数をnullにすることはできませんが、コンパイラエラーなしでnullと比較することができます。

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

DateTimeをNullableに設定できます。デフォルトではDateTimeはNULL可能ではありません。いくつかの方法でそれをNULL可能にすることができます。 DateTime型の後に疑問符を使用しますか。 myTimeまたは汎用スタイルNullableを使用します。私はmsdnにいくつかのリンクを追加しました。

Nullableを使用する

NULL可能

4
user29958

注意してください - Nullableを使うとき、それは明らかにもはや「純粋な」datetimeオブジェクトではありません。そのため、DateTimeメンバーに直接アクセスすることはできません。説明してみましょう。

Nullable <>を使うことで、基本的にDateTimeを入れ子にすることができます(ありがとうジェネリック) - それは明らかにその目的です。このコンテナには、前述の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の使い方はおそらく投稿する価値があると思います。同意しない場合は申し訳ありません。

edit:それは少し過度に特定的でケース依存であったので3番目のオプションを削除しました。

3
Gabe

誰もがあなたにすでに答えを与えていますが、私はdatetimeを関数に渡すのを簡単にする方法を述べます

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

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

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

2
No Holidays

Throws ArgumentNullExceptionの単体テストを実行しているときに、DateTimeのパラメータとしてNullを指定しなければならなかったのと同じ問題がありました。

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

あなたが、時々、nullを期待しているなら、あなたはこのような何かを使うことができます:

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

リポジトリでnull可能なdatetimeを使用してください。

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

日付/時刻データ型の性質上、null値を含めることはできません。つまり、値を含める必要があるため、空白にすることも、何も含まないこともできません。日付/時刻変数をnullableとしてマークした場合は、それにnull値を代入することしかできません。だからあなたがしたいのは、2つのうちの1つです(もっとあるかもしれませんが、2つしか考えられません)。

  • 値がない場合は、変数に最小の日付/時刻値を割り当てます。最大の日付/時刻値も、自分に合った方法で割り当てることができます。日付/時刻の値を確認するときは、サイト全体で一貫性があることを確認してください。 minmaxのどちらを使うか決めて、それに固執してください。

  • 日付/時刻変数を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を使用すると、上記とは少し違った外観になります(DateTime.MinValueの代わりにnullを割り当てる)。

BlogPost blogPost = new BlogPost();
blogPost.DateModified = sqlDataReader.IsDBNull(0) ? (DateTime?)null : sqlDataReader.GetFieldValue<DateTime>(0);
blogPost.DatePublished = sqlDataReader.GetFieldValue<DateTime>(1);

これが混乱を解消するのに役立つことを願っています。私の応答が約8年後になっていることを考えると、あなたはおそらく今ではエキスパートC#プログラマーである:)

0
Brendan Vogt