Scala重构字符串到Date代码

时间:2013-11-06 17:47:49

标签: mongodb scala date

我有一个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提供帮助以解决所有日期/时间类型问题。

2 个答案:

答案 0 :(得分:1)

您需要选项和地图:

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

答案 1 :(得分:0)

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

这是Try相当于pedrofurla的答案。

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?
}