我一直在寻找,但没有找到解决办法。如何处理应该能够包含未初始化值(相当于null)的DateTime ?我有一个类,它可能有一个DateTime属性值设置或没有。我正在考虑将属性持有人初始化为DateTime。MinValue,然后可以很容易地检查。我想这是一个很常见的问题,你是怎么做到的?


当前回答

您可以将DateTime设置为Nullable。默认情况下DateTime不是空的。有几种方法可以使它为空。在类型DateTime后使用问号?myTime或使用泛型样式Nullable。

DateTime? nullDate = null;

or

DateTime? nullDate;

其他回答

如果你使用。net 2.0(或更高版本),你可以使用可空类型:

DateTime? dt = null;

or

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吗?myDate而不是DateTime。

只是需要注意的是,当使用Nullable对象时,它显然不再是一个“纯”datetime对象,因此你不能直接访问datetime成员。我会尽力解释的。

通过使用Nullable<>,你基本上是将DateTime包装在一个容器中(感谢泛型),它是空的-显然它的目的。这个容器有自己的属性,你可以调用它来访问前面提到的DateTime对象;在使用正确的属性后-在这种情况下是Nullable。值-然后您可以访问标准的DateTime成员,属性等。

那么,现在我想到的问题是访问DateTime对象的最佳方式。有几种方法,第一种是目前为止最好的,第二种是“伙计,为什么”。

使用Nullable。价值属性, DateTime date = myNullableObject.Value.ToUniversalTime();/ /工作 DateTime date = myNullableObject.ToUniversalTime();//不是datetime对象,失败 使用Convert.ToDateTime()将可空对象转换为datetime, DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime();//可以,但是为什么…

虽然答案在这一点上有很好的文档,但我相信Nullable的用法可能值得发表。如果你不同意,我很抱歉。

edit:删除了第三个选项,因为它有点过于具体和大小写依赖。

DateTime ?MyDateTime{拿套;}

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

值得指出的是,虽然DateTime变量不能为空,但它仍然可以被比较为空而不会出现编译器错误:

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