在Scala中与一年零一个月约会

时间:2015-08-06 10:35:09

标签: scala date parsing

这是问题所在,我以这种格式得到了一个日期:

1987-12-00和1987-00-00 YYYY-MM-DD

我必须使用年份和月份在scala中的日期中解析此字符串。因为有时碰巧我没有这一天。

当我试图这样做时,我有例外:

dateHelper.parseDate( “1987-00-00”)

线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:1

谢谢!

2 个答案:

答案 0 :(得分:1)

不考虑错误检查,您可以这样做:

def parse(s: String) : (String, String) = {
  s.split("-") match {
    case Array(year, date, _*) => (year, date)
  }
}

val s1 = "1987-12-00"
val (y,d) = parse("1987-12-00")
> y: String = 1987
> d: String = 12

通过错误检查,您需要决定是将其包装在Try或Either还是其他类型中。

答案 1 :(得分:0)

你有几个问题。首先,您提供的示例不是有效的ISO 8601日期,并且它们也是模棱两可的。这会使您超越标准日期类型,这些日期类型在接受和模拟单个时间点的日期往往非常严格。但主要问题是你没有说出你想要的结果(因此在撰写本文时你的问题是-3投票)。

您几乎肯定首先要为此变体日期格式编写自己的解析器;如果输入格式有一些额外的变化,请使用正则表达式,否则如果始终 YYYY-MM-DD,则可以按s.split("-")取消它Markus's reply

这可以在没有真正思考的情况下完成。现在,您需要决定实际意味着的部分日期,即收集业务需求。例如,如果在模糊期间使用最早的日期就足够了,这种事就足够了:

val date = (month, day) match {
  case (0, 0) => new Date(year, 1, 1)       // just a year, assume Jan 1st
  case (_, 0) => new Date(year, month, 1)   // year and month, assume 1st
  case _      => new Date(year, month, day) // full date, excellent!
}

其他方法是构建自己的简单日期类型,其中包含Option个值 - 如果您不需要执行复杂的日期计算,则可以使用{-3}}它具有即时和周期类型,并将它们组合成一个元组/对象,用于描述模糊日期所涵盖的时间跨度。