2016-10-26 32 views
3

我檢查,如果日期是在Java中兩個日期之間的標準方法是這樣的:檢查日期範圍之間的日期也處理空值的Java

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

我要添加上的startDate空值的支持或endDate(意味着用戶沒有輸入日期,如果startDate爲空,我只想檢查endDate,如果endDate爲空,我只想檢查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)); 
} 

但它感覺非常糟糕的代碼。有沒有其他方法可以解決這個問題?

+1

讀書。但是你可能會考慮這是否會更適合codereview.stackexchange.com。 – JETM

+0

這是爲了包容,而不是嚴格的前後。 – uraza

+0

assylias的答案是最好的,但代碼的第二個版本非常合理。 – VGR

回答

9

如何:

return (startDate == null || !date.before(startDate)) 
    && (endDate == null || !date.after(endDate)); 

它使用的事實,這兩個語句是等價的:

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

而事實上,||是短路,從而防止NullPointerException異常。

+0

這是這裏最乾淨的答案。因爲我有類似的情況,甚至可能自己使用它。 –

+0

這似乎工作。我也爲了避免NPE而添加了一個空日期檢查。 – uraza

+0

@uraza我懷疑空日期會是一個錯誤,所以你可以在你的方法的第一行添加'Objects.requireNonNull(date);'。 – assylias

1

這應該是等價的:

public static boolean isWithinRange(Date date, Date startDate, Date endDate) { 
    return !(startDate != null && date.before(startDate) || endDate != null && date.after(endDate)); 
} 
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; 
} 
+0

您可以添加一些示例代碼來顯示如何在問題的上下文中使用它? –

+0

@BasilBourque不知道你的意思 - 我沒有改變'isWithinRange'方法的簽名。你能澄清你究竟在問什麼嗎? – Mureinik

+0

是的,我現在明白了。我誤解你的代碼,認爲你是從'Comparator'類引用而不是使用它。 –

相關問題