私はたくさん検索してきましたが、解決策を見つけることができませんでした。初期化されていない値 (null に相当) を含むことができるはずの DateTime をどのように処理しますか? DateTime プロパティ値が設定されているかどうかにかかわらず、クラスがあります。プロパティ ホルダーを DateTime.MinValue に初期化することを考えていましたが、これは簡単に確認できます。これはかなり一般的な質問だと思いますが、どうすればいいですか?
15 に答える
通常の DateTime の場合、それらをまったく初期化しないとDateTime.MinValue
、参照型ではなく値型であるため、一致します。
次のように、null 許容の DateTime を使用することもできます。
DateTime? MyNullableDate;
または長い形式:
Nullable<DateTime> MyNullableDate;
最後に、任意のタイプのデフォルトを参照する方法が組み込まれています。これはnull
参照型に対して返されますが、DateTime の例では次のように返されDateTime.MinValue
ます。
default(DateTime)
または、C# の最近のバージョンでは、
default
.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
日付時刻?MyDateTime{get;set;}
MyDateTime = (dr["f1"] == DBNull.Value) ? (DateTime?)null : ((DateTime)dr["f1"]);
nullable typesの使用を検討します。
DateTime? myDate
の代わりにDateTime myDate
。
DateTime
変数を にすることはできませんが、コンパイラ エラーなしnull
で と比較できることを指摘する価値があります。null
DateTime date;
...
if(date == null) // <-- will never be 'true'
...
DateTimeをNullableに設定できます。デフォルトでは、DateTimeはnull許容ではありません。いくつかの方法でnull許容にすることができます。タイプDateTimeの後に疑問符を使用しますか?myTimeまたは汎用スタイルNullableを使用します。
DateTime? nullDate = null;
また
DateTime? nullDate;
null 許容クラスを使用できます。
DateTime? date = new DateTime?();
これには、null 許容の DateTime を使用できます。
Nullable<DateTime> myDateTime;
または次のように書かれた同じもの:
DateTime? myDateTime;
私はいつも時刻を に設定していDateTime.MinValue
ます。このようにして、 NullErrorException を取得せず、設定されていないことがわかっている日付と比較できます。
注意してください - Nullable を使用すると、明らかに「純粋な」datetime オブジェクトではなくなるため、DateTime メンバーに直接アクセスすることはできません。説明してみます。
Nullable<> を使用することで、基本的に、DateTime を null 許容のコンテナー (ジェネリックに感謝) にラップしています。明らかにその目的です。このコンテナーには、前述の DateTime オブジェクトへのアクセスを提供する呼び出し可能な独自のプロパティがあります。正しいプロパティ (この場合は Nullable.Value) を使用した後、標準の DateTime メンバー、プロパティなどにアクセスできます。
そのため、DateTime オブジェクトにアクセスするための最良の方法について、問題が頭に浮かびます。いくつかの方法があります.1番はFARで最高で、2番は「おいおい」です.
Nullable.Value プロパティを使用して、
DateTime date = myNullableObject.Value.ToUniversalTime(); //Works
DateTime date = myNullableObject.ToUniversalTime(); //Not a datetime object, fails
Convert.ToDateTime() を使用して、null 許容オブジェクトを datetime に変換します。
DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime(); //works but why...
この時点で答えは十分に文書化されていますが、 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){...}
日付/時刻データ型の性質上、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# プログラマーのエキスパートです :)