我制作了以下代码,以查找当前日期是否在特定时间段内,但具有可选边界:
func isElligiblePeriod() {
now = new Date();
if (!validFrom && !validTo) {
return true;
} elseif (now >= validFrom && now <= validTo) {
return true;
} elseif (!validTo && now >= validFrom) {
return true;
} elseif (!validFrom && now <= validTo) {
return true;
}
return false;
}
基本上,这意味着如果有一个validTo日期,一个validFrom,两者都没有,那么就会发生检查。如果没有约束,则日期始终有效,可以单独检查每个约会。但是,这段代码很丑陋。我怎样才能改善这个?
答案 0 :(得分:4)
看起来你想要:
// Check the lower bound, if we have one
if (validFrom && now < validFrom)
{
return false;
}
// Check the upper bound, if we have one
if (validTo && now > validTo)
{
return false;
}
return true;
或作为条件:
return validFrom && now < validFrom ? false
: validTo && now > validTo ? false
: true;
或作为单一条件:
return !(validFrom && now < validFrom)
&& !(validTo && now > validTo);
或者:
return (!validFrom || now >= validFrom)
&& (!validTo || now <= validTo);
选择您认为最具可读性的方法。
请注意,如果您确保validFrom
和validTo
始终是合理的值,则可以真正可读 - 使用&#34;时间开始&#34;和&#34;时间结束&#34;值表示&#34; no来自约束&#34;或者&#34;不约束&#34;。然后你就可以:
return validFrom <= now && now <= validTo;
顺便说一句,您可能需要考虑使上限独占。这通常(但并不总是)是一个好主意 - 这意味着您可以非常轻松地拥有相邻的时间段(其中一个句点的validFrom
是前一个句点的validTo
。
答案 1 :(得分:1)
在C#中:
bool IsElligiblePeriod( DateTime t, DateTime? from, DateTime? to )
{
return ( from == null || t >= from.Value ) &&
( to == null || t <= to.Value );
}
或者如果我们以伪代码的方式进行:
return ( !validFrom || now >= validFrom ) &&
( !validTo || now <= validTo );
比一堆if,更短,更整洁,恕我直言。
答案 2 :(得分:0)
在C#中,假设validFrom
和validTo
是可以为空的DateTimes,我更喜欢:
return (now >= validFrom ?? DateTime.MinValue)
&& (now <= validTo ?? DateTime.MaxValue);