306

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

4

15 に答える 15

478

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

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

DateTime? MyNullableDate;

または長い形式:

Nullable<DateTime> MyNullableDate;

最後に、任意のタイプのデフォルトを参照する方法が組み込まれています。これはnull参照型に対して返されますが、DateTime の例では次のように返されDateTime.MinValueます。

default(DateTime)

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

default
于 2008-10-21T12:56:04.887 に答える
90

.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

于 2008-10-21T12:56:19.130 に答える
41

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

MyDateTime = (dr["f1"] == DBNull.Value) ? (DateTime?)null : ((DateTime)dr["f1"]);
于 2010-04-28T16:08:16.100 に答える
14

nullable typesの使用を検討します。

DateTime? myDateの代わりにDateTime myDate

于 2008-10-21T12:56:11.157 に答える
8

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

DateTime date;
...
if(date == null) // <-- will never be 'true'
  ...
于 2014-04-30T22:00:23.920 に答える
7

DateTimeをNullableに設定できます。デフォルトでは、DateTimeはnull許容ではありません。いくつかの方法でnull許容にすることができます。タイプDateTimeの後に疑問符を使用しますか?myTimeまたは汎用スタイルNullableを使用します。

DateTime? nullDate = null;

また

DateTime? nullDate;
于 2008-10-21T13:27:33.853 に答える
6

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

DateTime? date = new DateTime?();
于 2008-10-21T12:56:47.817 に答える
6

これには、null 許容の DateTime を使用できます。

Nullable<DateTime> myDateTime;

または次のように書かれた同じもの:

DateTime? myDateTime;
于 2008-10-21T12:56:57.207 に答える
5

私はいつも時刻を に設定していDateTime.MinValueます。このようにして、 NullErrorException を取得せず、設定されていないことがわかっている日付と比較できます。

于 2008-10-21T12:57:16.443 に答える
4

注意してください - Nullable を使用すると、明らかに「純粋な」datetime オブジェクトではなくなるため、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 番目のオプションは、少し具体的すぎて大文字と小文字に依存するため、削除しました。

于 2016-01-28T07:25:34.493 に答える
2

誰もがすでに答えを出していますが、日時を関数に簡単に渡す方法について言及します

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

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

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

于 2016-07-18T11:26:25.027 に答える
1

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

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

リポジトリでは、null 可能な日時を使用してください。

public Orders[] GetOrders(string id, DateTime? dateFrom, DateTime? dateTo){...}
于 2013-05-14T12:19:09.050 に答える
0

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

  • 値がない場合は、最小の日付/時刻値を変数に割り当てます。日付/時刻の最大値を割り当てることもできます - どちらの方法でも構いません。日付/時刻の値を確認するときは、サイト全体で一貫していることを確認してください。minまたはを使用することを決定し、maxそれに固執します。

  • 日付/時刻変数を としてマークしますnullablenullこのようにして、変数がない場合に日付/時刻変数を設定できます。

例を使用して、最初のポイントを示しましょう。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 番目のポイントを達成できますnullablenull値がない場合は、次のように設定できます。

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# プログラマーのエキスパートです :)

于 2016-07-26T09:43:22.530 に答える