检查日期范围之间的日期是否也处理空值Java

时间:2016-10-26 11:44:42

标签: java date date-comparison

我在Java中检查日期是否介于两个日期之间的标准方法如下所示:

public static boolean isWithinRange(Date date, Date startDate, Date endDate) {
    return !(date.before(startDate) || date.after(endDate));
}

我想在startDate或endDate上添加对空值的支持(意味着用户没有输入日期。如果startDate为null,我只想检查endDate,如果endDate为null,我只想检查startDate,如果两个都是null然后它是真的。我目前的解决方案看起来像这样:

public static boolean isWithinRange(Date date, Date startDate, Date endDate) {
    if (startDate == null && endDate == null) {
        return true;
    }

    if (!(startDate != null || !date.after(endDate))) {
        return true;
    }

    if (!(endDate != null || !date.before(startDate))) {
        return true;
    }

    return !(date.before(startDate) || date.after(endDate));
}

备选更具可读性的例子:

public static boolean isWithinRange(Date date, Date startDate, Date endDate) {
    if (startDate == null && endDate == null) {
        return true;
    }

    if (startDate == null && date.before(endDate))) {
        return true;
    }

    if (endDate == null && date.after(startDate))) {
        return true;
    }

    return date.after(startDate) && date.before(endDate));
}

但感觉真的很糟糕。有没有其他方法可以解决这个问题?

3 个答案:

答案 0 :(得分:10)

怎么样:

!(date.before(startDate) || date.after(endDate))
!date.before(startDate) && !date.after(endDate)

这使用了这两个陈述是等价的事实:

||

public Task<>是一个短路的事实,它阻止了NullPointerExceptions。

答案 1 :(得分:2)

Java 8增强到Comaparator界面提供了一种非常优雅的方式:

private static final Comparator<Date> NULL_SAFE_BEFORE =
        Comparator.nullsFirst(Comparator.naturalOrder());

private static final Comparator<Date> NULL_SAFE_AFTER =
        Comparator.nullsLast(Comparator.naturalOrder());

public static boolean isWithinRange(Date date, Date startDate, Date endDate) {
    return NULL_SAFE_BEFORE.compare(startDate, date) < 0 &&
            NULL_SAFE_AFTER.compare(date, endDate) < 0;
}

答案 2 :(得分:1)

这应该是等价的:

public static boolean isWithinRange(Date date, Date startDate, Date endDate) {
    return !(startDate != null && date.before(startDate) || endDate != null && date.after(endDate));
}