2016-10-26 2 views
3

Моего стандартный метод для проверки, если дата между двумя датами в Java выглядит следующим образом:Проверьте дату между диапазоном дат, которые также обработать нулевые значения 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)); 
} 

Но это похоже на действительно плохой код. Есть ли другой способ справиться с этим?

+1

Все 's делают его довольно трудно для меня! читать. Но вы можете подумать, будет ли это лучше подходит для 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) 

И тот факт, что || является коротким замыканием, которое предотвращает NullPointerExceptions.

+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

Да, я вижу это сейчас. Я неправильно читаю код, думая, что вы цитируете его из класса «Компаратор», а не используете его. –

Смежные вопросы