这是问题所在,我以这种格式得到了一个日期:
1987-12-00和1987-00-00 YYYY-MM-DD
我必须使用年份和月份在scala中的日期中解析此字符串。因为有时碰巧我没有这一天。
当我试图这样做时,我有例外:
dateHelper.parseDate( “1987-00-00”)
线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:1
谢谢!
答案 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}}它具有即时和周期类型,并将它们组合成一个元组/对象,用于描述模糊日期所涵盖的时间跨度。