我在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));
}
但感觉真的很糟糕。有没有其他方法可以解决这个问题?
答案 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));
}