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?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;