Как сравнить дату / время в форме в рамках Scala Play?

#java #scala #validation #playframework #jodatime

#java #scala #проверка #playframework #jodatime

Вопрос:

Я добавляю проверку параметров даты в форме Scala; есть необязательные поля даты, которые позволяют пользователю выполнять поиск в определенном диапазоне дат / времени, но вторая дата должна быть после первой даты для допустимого диапазона.

На данный момент эта проверка работает:

 val searchForm = Form(
  mapping(
    "ItemID" -> optional(text),
    "fromDate" ->  optional(jodaLocalDate("yyyy-MM-dd:HH:mm:ss")),
    "toDate" -> optional(jodaLocalDate("yyyy-MM-dd:HH:mm:ss")),
    "Class" -> optional(text),
    "Status" -> optional(text),
    "Group" -> optional(text),
    "Area" -> nonEmptyText,
    "Ordered" -> optional(text)
  )(SearchModel.apply)(SearchModel.unapply)
  verifying("Both or no dates must be selected. Date/Time range must be valid.", f => (f.fromDate.isEmpty amp;amp; f.toDate.isEmpty)||
  ((f.fromDate.isDefinedamp;amp;f.toDate.isDefined)amp;amp;f.fromDate.head.isBefore(f.toDate.head))))
 

Но он сравнивает только даты и игнорирует раздел времени HH:mm:ss .

Есть ли способ добавить проверку времени? Должен ли я использовать другой метод проверки?

Комментарии:

1. Ваша html-форма также отправляет временную часть?

Ответ №1:

До тех пор, пока вы получаете раздел времени из формы, вызов даты .before() , безусловно, будет проверять и часть времени.

Попробуйте:

 def validateDates(fromDate: Option[Date], toDate: Option[Date]): Boolean = {
  if(fromDate.isEmpty || toDate.isEmpty) false 
  else fromDate.get.before(toDate.get)
}
 

Затем:

 verifying("Both or no dates must be selected. Date/Time range must be valid.", f => validateDates(f.fromDate, f.toDate))
 

Редактировать:
Просто понял, что это не пройдет, если оба поля даты пусты, поэтому небольшая модификация validateDates исправит это:

 def validateDates(fromDate: Option[Date], toDate: Option[Date]): Boolean = {
      if(fromDate.isEmpty amp;amp; toDate.isEmpty) true 
      else if(fromDate.isEmpty || toDate.isEmpty) false 
      else fromDate.get.before(toDate.get)
    }