查找DateTime是否在句点内,具有可选边界?

时间:2015-08-13 14:03:09

标签: java c#

我制作了以下代码,以查找当前日期是否在特定时间段内,但具有可选边界:

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,两者都没有,那么就会发生检查。如果没有约束,则日期始终有效,可以单独检查每个约会。但是,这段代码很丑陋。我怎样才能改善这个?

3 个答案:

答案 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);

选择您认为最具可读性的方法。

请注意,如果您确保validFromvalidTo始终是合理的值,则可以真正可读 - 使用&#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#中,假设validFromvalidTo是可以为空的DateTimes,我更喜欢:

return (now >= validFrom ?? DateTime.MinValue)
    && (now <= validTo ?? DateTime.MaxValue);