Scala 将字符串重构为日期代码



我有一个接受日期作为字符串作为查询参数的 API。在大多数情况下,我希望我的用户以"yyyyMMdd"的格式发送一个可选的日期参数,以便为 2013 年 10 月 12 日2013/10/12一个示例。然后,我在MongoDB和/或缓存中搜索与所述日期匹配的某些数据的记录。我拥有将字符串转换为 Scala 中理智的代码如下:

def parseDate(date: String): org.joda.time.DateTime = {
    val formatter = DateTimeFormat.forPattern("yyyyMMdd")  
    formatter.parseDateTime(date)
}

这很好用。现在我遇到的问题是当用户不提交日期时,我想默认为今天的日期。这就是我需要帮助的地方。我没有很好的方法将其转换为字符串以传递给此方法。我的代码如下所示:

val gdate = params.getOrElse("gamedate", "0")
val date = gdate match {
   case gd:String => MyDateTimeHelper.parseDate(gd)
}

这显然是错误的。我想我也许可以做到:

val gdate = params.getOrElse("gamedate", new DateTime)

但这也不是解决方案(我假设它只会绕过匹配,因为它已经是一个 Date 实例而不是字符串。

在 Scala 中解决这个问题的体面方法是什么?我只是 Scala 帮助我解决所有日期/时间类型问题的 jodatime。

你想要选项和映射:

val gdate:Option[String] = params.get("gamedate")
val date:Option[DateTime] = gdate map { MyDateTimeHelper.parseDate _ }
val dateOrDefault:DateTime = date.getOrElse(new DateTime)

您也可以使用 util.Try ,IMO 更具可读性。

这是一个相当于佩德罗弗拉的答案的Try

val gdate:Try[String] = params.get("gamedate")
val date:Try[DateTime] = gdate map { MyDateTimeHelper.parseDate _ }
val dateOrDefault:DateTime = date match {
  case Success(d) => d
  case Failure(e) => new DateTime   // also print out the exception?
}

最新更新