質問

よく検索しましたが、解決策が見つかりませんでした。初期化されていない値(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である必要があることに注意してください

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'
  ...

警告が表示されます-Nullableを使用する場合、明らかに「純粋な」datetimeオブジェクトではないため、DateTimeメンバーに直接アクセスできません。説明してみます。

Nullableを使用して&lt;&gt;基本的には、DateTimeをnull値を許可するコンテナ(ジェネリックに感謝)でラップしています-明らかにその目的です。このコンテナには、前述のDateTimeオブジェクトへのアクセスを提供する独自のプロパティがあります。正しいプロパティ(この場合はNullable.Value)を使用すると、標準のDateTimeメンバー、プロパティなどにアクセスできます

それで、DateTimeオブジェクトにアクセスするための最良の方法に関して問題が思い浮かびます。いくつかの方法があります。1番がFARによるもので、2番が "dude why"です。

  1. Nullable.Valueプロパティの使用

    DateTime date = myNullableObject.Value.ToUniversalTime(); //動作

    DateTime date = myNullableObject.ToUniversalTime(); //日時オブジェクトではなく、失敗します

  2. 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#プログラマーでしょう:)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top