DateTime“null”值

时间:2008-10-21 12:54:33

标签: c# datetime null

我一直在搜索很多,但找不到解决方案。你如何处理应该能够包含未初始化值(相当于null)的DateTime?我有一个类可能设置了DateTime属性值。我正在考虑将属性持有者初始化为DateTime.MinValue,然后可以轻松检查。我想这是一个很常见的问题,你是怎么做到的?

15 个答案:

答案 0 :(得分:387)

对于普通的DateTimes,如果你根本没有初始化它们,那么它们将匹配DateTime.MinValue,因为它是值类型而不是引用类型。

你也可以使用可以为空的DateTime,如下所示:

DateTime? MyNullableDate;

或更长的形式:

Nullable<DateTime> MyNullableDate;

最后,有一种内置方式可以引用任何类型的默认值。这会为引用类型返回null,但对于我们的DateTime示例,它将返回与DateTime.MinValue相同的内容:

default(DateTime)

答案 1 :(得分:81)

如果您使用的是.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/en-us/library/b3h38hb0.aspx

答案 2 :(得分:28)

的DateTime? MyDateTime {获得;设置;}

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

答案 3 :(得分:22)

以下方式也适用

myClass.PublishDate = toPublish ? DateTime.Now : (DateTime?)null;

请注意,属性PublishDate应该是DateTime?

答案 4 :(得分:12)

我考虑使用nullable types

DateTime? myDate代替DateTime myDate

答案 5 :(得分:6)

您可以使用可以为空的类。

DateTime? date = new DateTime?();

答案 6 :(得分:6)

您可以使用可为空的DateTime。

Nullable<DateTime> myDateTime;

或者像这样写的东西:

DateTime? myDateTime;

答案 7 :(得分:5)

我总是将时间设置为DateTime.MinValue。这样我就不会得到任何NullErrorException,我可以将它与我知道未设置的日期进行比较。

答案 8 :(得分:5)

值得指出的是,虽然DateTime变量不能是null,但在没有编译器错误的情况下仍然可以与null进行比较:

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

答案 9 :(得分:4)

您可以将DateTime设置为Nullable。默认情况下,DateTime不可为空。您可以通过几种方式使其可以为空。在DateTime类型后使用问号? myTime或使用通用样式Nullable。我在msdn上添加了几个链接。

Using Nullable

Nullable

答案 10 :(得分:3)

请注意 - 当使用Nullable时,它显然不再是纯粹的&#39; datetime对象,因此您无法直接访问DateTime成员。我试着解释一下。

使用Nullable&lt;&gt;你基本上将DateTime包装在一个可以为空的容器中(谢谢泛型) - 显然是它的目的。此容器具有自己的属性,您可以调用它们来访问上述DateTime对象;在使用正确的属性(在本例中为Nullable.Value)之后,您可以访问标准的DateTime成员,属性等。

所以 - 现在想到了访问DateTime对象的最佳方法的问题。有几种方法,1号是FAR最好的,2号是&#34;老兄为什么&#34;。

  1. 使用Nullable.Value属性

    DateTime date = myNullableObject.Value.ToUniversalTime(); //Works

    DateTime date = myNullableObject.ToUniversalTime(); //Not a datetime object, fails

  2. 使用Convert.ToDateTime()将可空对象转换为datetime,

    DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime(); //works but why...

  3. 虽然答案在这一点上有详细记载,但我相信Nullable的使用可能值得张贴。对不起,如果你不同意。

    编辑:删除了第三个选项,因为它有点过于具体和依赖于案例。

答案 11 :(得分:2)

尽管每个人都已经给出了答案,但我会提到一种方法,可以很容易地将日期时间传递给函数

[错误:无法转换system.datetime?到system.datetime]

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

现在你可以在函数内部传递dte而没有任何问题。

答案 12 :(得分:1)

如果你有时候,期望null,你可以使用这样的东西:

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

在您的存储库中使用null-able datetime。

public Orders[] GetOrders(string id, DateTime? dateFrom, DateTime? dateTo){...}

答案 13 :(得分:1)

我遇到了同样的问题,因为在执行Throws ArgumentNullException的单元测试时,我必须将Null作为DateTime的参数。在我的情况下使用以下选项工作:

Assert.Throws<ArgumentNullException>(()=>sut.StartingDate = DateTime.Parse(null));

答案 14 :(得分:0)

鉴于日期/时间数据类型的性质,它不能包含null值,即它需要包含一个值,它不能为空或不包含任何内容。如果将日期/时间变量标记为nullable,则只能为其指定空值。所以你要做的是两件事之一(可能会有更多,但我只能想到两件事):

  • 如果您没有值,请为变量指定最小日期/时间值。您也可以指定最大日期/时间值 - 以适合您的方式。在检查日期/时间值时,请确保您在站点范围内保持一致。决定使用minmax并坚持下去。

  • 将您的日期/时间变量标记为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#程序员的专家:)