39

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

有什么建议么?

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

编辑:抱歉混淆...myobject.ExpireDatetime 是 DateTime 类型。

4

5 回答 5

47

你的问题对我来说不是很清楚,但如果我们有

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

可以这么说

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

ExpireDateTime如果是nullHasValue为假),这将是可以的。一些没有经验的开发人员会很难理解提升的操作符,所以为了更清楚,你可以写

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

它是相同的,但更易于阅读和理解。

.Value当然,如果 nullable 可能为 null,则永远不要写。如果你这样做,你会得到一个InvalidOperationException “Nullable object must have a value” 。

于 2012-12-02T20:16:03.807 回答
36

我建议您使用以下内容:

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
于 2015-08-31T05:41:26.300 回答
8

编译器提升变量并生成代码以检查空值。

> 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 一切都将为假,否则它将像正常的 DateTime 比较一样工作。

于 2018-11-29T09:39:59.983 回答
4

如果 ExpireDateTime是, Nullable<DateTime>我会改为执行以下操作:

if (ExpireDateTime.HasValue && ExpireDateTime < DateTime.Now.ToUniversalTime())
{ 
}
于 2012-12-02T19:53:57.817 回答
1

使用Value可为空的属性:

objet.ExpireDateTime.Value

if (!object.ExpireDateTime.IsNull() 
    && DateTime.Compare(objet.ExpireDateTime.Value, 
                        DateTime.Now.ToUniversalTime()) < 0)
{ 
}    
于 2012-12-02T19:51:54.583 回答