比较可以为空的DateTime?

时间:2012-12-02 19:50:13

标签: c# c#-4.0 datetime

寻找更好的方法来比较可以为空的日期时间而不是以下内容:

有什么建议吗?

// myobject.ExpireDatetime is of DateTime?
//
if (!myobject.ExpireDateTime.IsNull() && DateTime.Compare((DateTime)myobject.ExpireDateTime, DateTime.Now.ToUniversalTime()) < 0)
{ //error! }    
  

编辑:抱歉混淆... myobject.ExpireDatetime属于类型   日期时间。

5 个答案:

答案 0 :(得分:31)

我的问题不是很明确,但如果我们有

DateTime? ExpireDateTime;  // could be a variable or a property

可以说

if (ExpireDateTime < DateTime.UtcNow)
{
  ...
}

如果ExpireDateTimenullHasValue为false),则可以。一些缺乏经验的开发人员很难理解lifted operators,所以为了更清楚,你可以写

if (ExpireDateTime < (DateTime?)DateTime.UtcNow)
{
  ...
}

它是一样的,但更容易阅读和理解。

从不.Value如果可以为null,当然。如果您这样做,您将获得InvalidOperationException “Nullable对象必须具有值

答案 1 :(得分:18)

我建议您使用以下内容:

int y = Nullable.Compare<DateTime>(DateTime.UtcNow, x); 

// x is the nullable date time object.
// y will be '-1' if x is greater than DateTime.UtcNow

答案 2 :(得分:1)

使用可空的Value属性:

objet.ExpireDateTime.Value

if (!object.ExpireDateTime.IsNull() 
    && DateTime.Compare(objet.ExpireDateTime.Value, 
                        DateTime.Now.ToUniversalTime()) < 0)
{ 
}    

答案 3 :(得分:1)

如果ExpireDateTimeNullable<DateTime>,我会改为关注:

if (ExpireDateTime.HasValue && ExpireDateTime < DateTime.Now.ToUniversalTime())
{ 
}

答案 4 :(得分:0)

编译器lifts变量并生成代码以检查是否为空。

> new DateTime?()
null
> DateTime.Now > null
false
> DateTime.Now < null
false

> new int?()
null
> 10 >= null
false
> 10 =< null
false
> 10 == null
false
> 10 != null
true

知道了这一点,您就可以编写简单的代码了。

// d is a DateTime? 
DateTime now = DateTime.Now;

bool after = d > now;
bool before = d < now;
bool today = d?.Date == now.Date;

如果d为null,则所有内容均为false,否则它将像正常的DateTime比较一样工作。