比较可为空的日期时间?

问题描述 投票:0回答:6

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

有什么建议吗?

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

编辑:抱歉造成混乱...myobject.ExpireDatetime 是类型 日期时间。

c# c#-4.0 datetime
6个回答
57
投票

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

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

只要说就可以了

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

如果

ExpireDateTime
null
HasValue
为 false),就可以了。一些缺乏经验的开发人员将很难理解提升运算符,因此为了使其更清楚,您可以编写

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

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

当然,如果可空值可能为空,则

永远不要

.Value
。如果您这样做,您将得到一个
InvalidOperationException
“可为 Null 的对象必须有一个值”


42
投票

我建议您使用以下内容:

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

12
投票

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

> 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 比较一样工作。


4
投票

如果

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

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

1
投票

使用可空值的

Value
属性:

objet.ExpireDateTime.Value

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

0
投票

如果像我一样,您最终遇到了这个问题,因为您意识到可空 DateTime 的相等语义在 C# 中根本没有意义,我制作了一个 Nuget 包 来解决这个问题。

考虑看看它,而不是为它疯狂。

DateTime? dt = DateTime.Now;
DateTime? dt2 = null;
bool isGreater = dt > dt2; //false
bool isGreater2 = dt.IsGreater(dt2); //true
© www.soinside.com 2019 - 2024. All rights reserved.