Answers:
对于普通的DateTimes,如果您根本不初始化它们,则它们将匹配DateTime.MinValue
,因为它是一个值类型而不是引用类型。
您还可以使用可为空的DateTime,如下所示:
DateTime? MyNullableDate;
或更长的形式:
Nullable<DateTime> MyNullableDate;
最后,有一种内置的方式可以引用任何类型的默认值。这将返回null
引用类型,但对于我们的DateTime示例,它将返回与相同的结果DateTime.MinValue
:
default(DateTime)
或者,在最新版本的C#中,
default
DateTime.MinValue
以及
MyNullableDate=date;
进行设置,MyDate = MyNullableDate.Value;
读取并if(MyNullableDate.HasValue)
检查其是否为空
如果您使用的是.NET 2.0(或更高版本),则可以使用可为空的类型:
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/zh-cn/library/b3h38hb0.aspx
dt.GetValueOrDefault()
-这是最有效的选择。
约会时间?MyDateTime {get; set;}
MyDateTime = (dr["f1"] == DBNull.Value) ? (DateTime?)null : ((DateTime)dr["f1"]);
null
行不通的。它必须是(DateTime?)null
。
您可以为此使用可为空的DateTime。
Nullable<DateTime> myDateTime;
或类似这样写的东西:
DateTime? myDateTime;
我总是把时间定为DateTime.MinValue
。这样,我不会收到任何NullErrorException异常,并且可以将其与我知道未设置的日期进行比较。
请注意-使用Nullable时,它显然不再是“纯”日期时间对象,因此,您不能直接访问DateTime成员。我会尽力解释。
通过使用Nullable <>,您基本上是将DateTime包装在一个可以为空的容器中(感谢泛型),这显然是其目的。这个容器有自己的属性,您可以调用该属性来访问上述DateTime对象。使用正确的属性(在本例中为Nullable.Value)之后,您便可以访问标准的DateTime成员,属性等。
因此,现在就想到了访问DateTime对象的最佳方法的问题。有几种方法,第一是FAR最好的,第二是“花花公子为什么”。
使用Nullable.Value属性,
DateTime date = myNullableObject.Value.ToUniversalTime(); //Works
DateTime date = myNullableObject.ToUniversalTime(); //Not a datetime object, fails
使用Convert.ToDateTime()将可为空的对象转换为日期时间,
DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime(); //works but why...
尽管此时答案已被很好地记录下来,但我相信Nullable的用法可能值得一提。抱歉,如果您不同意。
编辑:删除了第三个选项,因为它有点过分具体且取决于大小写。
我遇到了同样的问题,即在对Throws ArgumentNullException执行单元测试时必须将Null作为DateTime的参数。在我的情况下,使用以下选项可以正常工作:
Assert.Throws<ArgumentNullException>(()=>sut.StartingDate = DateTime.Parse(null));
给定日期/时间数据类型的性质,它不能包含null
值,即它需要包含一个值,不能为空或不包含任何值。如果将日期/时间变量标记为,nullable
则只能为其分配空值。因此,您想要做的是两件事之一(可能还有更多,但我只能想到两件事):
如果您没有变量,请为其指定一个最小日期/时间值。您也可以指定最大日期/时间值-哪种方式都适合您。检查日期/时间值时,只需确保您在整个站点范围内保持一致即可。确定使用min
or max
并坚持使用。
将您的日期/时间变量标记为nullable
。这样,您可以将日期/时间变量设置为null
无变量。
让我用一个例子说明我的第一点。该DateTime
变量的类型不能设置为null,它需要一个值,在这种情况下,我将其设置为DateTime
的最小值,如果没有价值。
我的情况是我有一BlogPost
堂课。它具有许多不同的字段/属性,但在此示例中我只选择使用两个。DatePublished
是该帖子发布到网站的时间,并且必须包含日期/时间值。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
。现在,您可以将其设置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#专家:)