比较可以为空的DateTime?

gen*_*eek 28 c# datetime c#-4.0

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

有什么建议?

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

编辑:抱歉混淆... myobject.ExpireDatetime的类型为DateTime.

Jep*_*sen 32

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

DateTime? ExpireDateTime;  // could be a variable or a property
Run Code Online (Sandbox Code Playgroud)

可以这么说

if (ExpireDateTime < DateTime.UtcNow)
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

如果ExpireDateTimenull(HasValue是假的),这将是OK .一些缺乏经验的开发人员很难理解提升的操作员,所以为了更清楚,你可以写

if (ExpireDateTime < (DateTime?)DateTime.UtcNow)
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

当然,永远不要.Value可空的null.如果您这样做,您将获得InvalidOperationException "Nullable对象必须具有值".

  • 但是,(默认(DateTime?)<DateTime.UtcNow)为false并且(默认(DateTime?)> DateTime.UtcNow)也为false (2认同)
  • @labroo 当然。所以对于可空值,我们没有“[trichotomy](https://en.wikipedia.org/wiki/Trichotomy_(mathematics))”,所以有时`x &lt; y`和`x == y`和`x &gt; y ` 都是 `false`。 (2认同)

lab*_*roo 20

我建议你使用以下内容:

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
Run Code Online (Sandbox Code Playgroud)


Pat*_*ick 6

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

> 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
Run Code Online (Sandbox Code Playgroud)

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

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

bool after = d > now;
bool before = d < now;
bool today = d?.Date == now.Date;
Run Code Online (Sandbox Code Playgroud)

如果 d 为空,一切都将是假的,否则它将像正常的 DateTime 比较一样工作。