检查日期范围之间的日期是否也处理空值 Java
Check if date between date range that also handle null values 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,如果两者都为空则为真。我当前的解决方案如下所示:
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));
}
但感觉代码真的很糟糕。还有其他方法可以解决这个问题吗?
怎么样:
return (startDate == null || !date.before(startDate))
&& (endDate == null || !date.after(endDate));
这利用了这两个语句等价的事实:
!(date.before(startDate) || date.after(endDate))
!date.before(startDate) && !date.after(endDate)
事实上 ||
是一个短路,可以防止 NullPointerExceptions。
这应该是等价的:
public static boolean isWithinRange(Date date, Date startDate, Date endDate) {
return !(startDate != null && date.before(startDate) || endDate != null && date.after(endDate));
}
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;
}
我检查日期是否在 Java 中的两个日期之间的标准方法如下所示:
public static boolean isWithinRange(Date date, Date startDate, Date endDate) {
return !(date.before(startDate) || date.after(endDate));
}
我想在 startDate 或 endDate 上添加对空值的支持(意味着用户没有输入日期。如果 startDate 为空,我只想检查 endDate,如果 endDate 为空,我只想检查 startDate,如果两者都为空则为真。我当前的解决方案如下所示:
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));
}
但感觉代码真的很糟糕。还有其他方法可以解决这个问题吗?
怎么样:
return (startDate == null || !date.before(startDate))
&& (endDate == null || !date.after(endDate));
这利用了这两个语句等价的事实:
!(date.before(startDate) || date.after(endDate))
!date.before(startDate) && !date.after(endDate)
事实上 ||
是一个短路,可以防止 NullPointerExceptions。
这应该是等价的:
public static boolean isWithinRange(Date date, Date startDate, Date endDate) {
return !(startDate != null && date.before(startDate) || endDate != null && date.after(endDate));
}
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;
}