我已经搜索了很多,但没有找到解决办法。你如何处理一个应该能够包含未初始化值(相当于null)的DateTime?我有一个类,它可能有一个DateTime属性值,也可能没有设置。我在考虑将属性持有者初始化为DateTime.MinValue,然后可以很容易地进行检查。我想这是一个很常见的问题,你是如何做到的?
对于普通的DateTimes,如果你根本不初始化它们,那么它们将与DateTime.MinValue
相匹配,因为它是一个值类型而不是一个引用类型。
你也可以使用一个可归零的DateTime,像这样。
DateTime? MyNullableDate;
或更长的形式。
Nullable<DateTime> MyNullableDate;
最后,有一个内置的方法来引用任何类型的默认值。 对于引用类型,它返回 "null",但对于我们的DateTime例子,它将返回与 "DateTime.MinValue "相同的内容。
default(DateTime)
如果你使用.NET 2.0(或更高版本),你可以使用nullable类型。
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"]);
请注意 - 当使用Nullable时,它显然不再是一个'纯粹的'.DateTime对象,因此你不能直接访问DateTime成员。 datetime对象,因此你不能直接访问DateTime成员。 我'会试着解释一下。
通过使用Nullable<>
你基本上是把DateTime包装在一个容器中(谢谢你的generics),这个容器是nullable的--显然是它的目的。
这个容器有它自己的属性,你可以调用这些属性来提供对上述DateTime对象的访问。
在使用正确的属性之后--在这种情况下是Nullable
所以--现在我们想到的问题是访问DateTime对象的最佳方式。 有几种方法,第1种是迄今为止最好的,第2种是"老兄为什么"。
DateTime date = myNullableObject.Value.ToUniversalTime(); //工作
DateTime date = myNullableObject.ToUniversalTime()。 //不是一个日期时间对象,失败
。
DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime()。 //工作,但为什么...
虽然答案在这一点上已经有了很好的记录,但我相信Nullable的用法可能值得发帖说明。 如果你不同意,抱歉。
编辑。 删除了第三个选项,因为它有点过于具体,而且依赖于案例。
我也遇到了同样的问题,当我在执行Throws ArgumentNullException的单元测试时,我必须给DateTime一个Null作为参数。
Assert.Throws<ArgumentNullException>(()=>sut.StartingDate = DateTime.Parse(null));
鉴于日期/时间数据类型的性质,它不能包含一个 "空 "值,也就是说,它需要包含一个值,不能是空白或什么都没有。 它需要包含一个值,它不能是空白或什么都不包含。 如果你把一个日期/时间变量标记为 "nullable",那么只有你才能给它分配一个空值。 所以你要做的是两件事之一(可能还有更多,但我只能想到两件事)。
给你的变量分配一个最小日期/时间值,如果你没有值的话。 你也可以指定一个最大日期/时间值--无论哪种方式适合你。 只要确保你在检查日期/时间值时,全站范围内保持一致。 决定使用 "min "或 "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 "来实现我的第二点。 现在,如果没有值,你可以将其设置为 "空"。
public DateTime? DateModified { get; set; }
使用 "ADO.NET "从数据库中获取数据,看起来会和上面的方法有些不同(将 "DateTime.MinValue "赋值为 "null")。
BlogPost blogPost = new BlogPost();
blogPost.DateModified = sqlDataReader.IsDBNull(0) ? (DateTime?)null : sqlDataReader.GetFieldValue<DateTime>(0);
blogPost.DatePublished = sqlDataReader.GetFieldValue<DateTime>(1);
我希望这有助于澄清任何困惑。 鉴于我的回复是在8年后,你现在可能已经是C#程序专家了:)