Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比较可为空的日期时间?_C#_C# 4.0_Datetime - Fatal编程技术网

C# 比较可为空的日期时间?

C# 比较可为空的日期时间?,c#,c#-4.0,datetime,C#,C# 4.0,Datetime,正在寻找比以下方法更好的方法来比较可为空的日期时间: 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 有什么建议吗 // myobject.ExpireDatetime is of DateTime? // if (!myobje

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

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
有什么建议吗

// myobject.ExpireDatetime is of DateTime?
//
if (!myobject.ExpireDateTime.IsNull() && DateTime.Compare((DateTime)myobject.ExpireDateTime, DateTime.Now.ToUniversalTime()) < 0)
{ //error! }    
//myobject.ExpiredAtTime是否为日期时间?
//
如果(!myobject.expireedatetime.IsNull()&&DateTime.Compare((DateTime)myobject.expireedatetime,DateTime.Now.ToUniversalTime())小于0)
{//错误!}
已编辑:很抱歉造成混淆…myobject.ExpireDatetime的类型为 日期时间

使用可为null的属性:

objet.ExpireDateTime.Value

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

如果
ExpireDateTime
是一个
可空的
,我会改为执行以下操作:

if (ExpireDateTime.HasValue && ExpireDateTime < DateTime.Now.ToUniversalTime())
{ 
}
if(ExpireDateTime.HasValue&&ExpireDateTime
我不太清楚你的问题,但如果我们有

DateTime? ExpireDateTime;  // could be a variable or a property
可以这么说

if (ExpireDateTime < DateTime.UtcNow)
{
  ...
}
这是一样的,但更容易阅读和理解


当然,如果可空值可能为空,则永远不要写入
.Value
。如果执行此操作,您将得到一个
InvalidOperationException
“可空对象必须有值”。

我建议您使用以下选项:

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
int y=null.Compare(DateTime.UtcNow,x);
//x是可为空的日期时间对象。
//如果x大于DateTime.UtcNow,则y将为'-1'
编译器变量并生成代码以检查空值

> 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
>新日期时间?()
无效的
>DateTime.Now>null
假的
>DateTime.Now新int?()
无效的
>10>=null
假的
>10=10==null
假的
> 10 != 无效的
真的
知道了这一点,您可以编写简单的代码

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

bool after = d > now;
bool before = d < now;
bool today = d?.Date == now.Date;
//d是日期时间吗?
DateTime now=DateTime.now;
bool after=d>现在;
bool-before=d

如果d为null,则所有内容都将为false,否则它将像正常的日期时间比较一样工作。

在C#中,单词
object
是一个关键字,不能用作标识符(除非您编写它
@object
)。我认为不清楚是否有一个装箱的
DateTime
可能是空引用,或者是否有一个未装箱的“true”可空的
DateTime
DateTime?
)。这是否回答了您的问题?原始问题仍然有一种气味,因为(在通常的实现中)
系统。对象
没有名为
ExpireDateTime
静态
成员(因此它仍然无法编译)。@JeppeStigNielsen-
ExpireDateTime
可能是一种扩展方法。@Oded您不能这样扩展。即使使用扩展方法,在点(
)之前也需要一个标识符或一个普通表达式。例如
(新对象()).ExpireDateTime()
typeof(对象)。ExpireDateTime()
@object.ExpireDateTime()
都可能使用某种(非常疯狂的)扩展方法进行编译。但是仅仅
对象
就有问题。此外,如果它是一种方法,您不能在不首先调用
ExpireDateTime
的情况下直接说
.IsNull
。简而言之,它永远不可能是有效的。很抱歉造成混淆…object.ExpiredAtime是DateTime类型。@JaJ在代码中写入
对象
“dot”
ExpiredAtime
是不合法的。太棒了!是的,这就是我真正想要的解释。也就是说,如何在不短路逻辑的情况下比较可空的日期时间,方法是检查值是否为空…然后检查可空值上的约束,如果(val.isnotnull&&val.iswithinconstraint)但是,(default(datetime?datetime.UtcNow)也为falsefalse@labroo当然因此,对于空值,我们没有“”,因此有时
x
x==y
x>y
都是
false
。这还取决于特定的业务需求。在某些情况下,我可能希望将空日期视为“大于”任何有效日期。例如:
minDate=d1
其中所有三个日期都可为空-在这种情况下,我希望
minDate
接收实际有效日期(如果有),但不为空,除非d1和d2都为空。@JustAMartin如果确实需要,您可以编写
!(ExpireDateTime>=DateTime.UtcNow)
如果未涉及
null
,则与
ExpireDateTime
相同,但在涉及
null
时具有相反的值。但是,阅读像
这样的内容可能更容易!ExpireDateTime.HasValue | | ExpireDateTime.Value
,具体取决于口味。
// d is a DateTime? 
DateTime now = DateTime.Now;

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