如何在 Scala Play Framework 中的表单上比较 date/time?

How to compare date/time on a form within the Scala Play Framework?

我正在为 Scala 表单中的日期选项添加验证;有一些可选的日期字段允许用户在特定的 date/time 范围内进行搜索,但第二个日期必须在第一个日期之后才能获得有效范围。

目前此验证有效:

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 && f.toDate.isEmpty)||
  ((f.fromDate.isDefined&&f.toDate.isDefined)&&f.fromDate.head.isBefore(f.toDate.head))))

但它只比较日期而忽略时间部分HH:mm:ss

有没有办法添加时间验证?我应该使用不同的验证方法吗?

只要您从表单中获取时间部分,日期调用 .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 && toDate.isEmpty) true 
      else if(fromDate.isEmpty || toDate.isEmpty) false 
      else fromDate.get.before(toDate.get)
    }