在Scala 2.8中,如何通过其长度和起始索引访问子字符串?

时间:2010-09-03 07:06:47

标签: datetime scala string

我的日期和时间分别在yyyyMMdd和HHmmss格式的不同字段中。为了解析它们,我想构建一个yyyy-MM-ddTHH:mm:ss字符串并将其提供给joda-time构造函数。所以我希望获得1-st 4位数,然后从索引5开始2位数,等等。如何实现这一目标? List.fromString(String)(我发现here)似乎被打破了。

4 个答案:

答案 0 :(得分:15)

substring方法当然可以帮助您,但Scala 2.8中的String也支持序列上的所有其他方法。 ScalaDoc for class StringOps提供了完整列表。

特别是,splitAt方法很方便。这是一个REPL互动,展示了如何。

scala> val ymd = "yyyyMMdd"
ymd: java.lang.String = yyyyMMdd

scala> val (y, md) = ymd splitAt 4
y: String = yyyy
md: String = MMdd

scala> val (m, d) = md splitAt 2
m: String = MM
d: String = dd

scala> y+"-"+m+"-"+d
res3: java.lang.String = yyyy-MM-dd

答案 1 :(得分:8)

只需在字符串上使用substring()方法即可。请注意,Scala字符串的行为类似于Java字符串(使用一些额外的方法),因此java.lang.String中的任何内容也可以用于Scala字符串。

val s = "20100903"
val t = s.substring(0, 4) // t will contain "2010"

(注意,参数不是长度和起始索引,而是起始索引(包括)和结束索引(不包括))。

但如果这是关于解析日期的,为什么不像使用Java一样使用java.text.SimpleDateFormat

val s = "20100903"
val fmt = new SimpleDateFormat("yyyyMMdd")
val date = fmt.parse(s)  // will give you a java.util.Date object

答案 2 :(得分:7)

如果你正在使用Joda Time,你应该可以使用

val date = DateTimeFormat.forPattern("yyyyMMdd, HHmmss")
                         .parseDateTime(field1 + ", " + field2)

对于像这样解析字符串的更普遍的问题,使用正则表达式会很有帮助(虽然在这种情况下我不建议使用它):

scala> val Date = "(\\d\\d\\d\\d)(\\d\\d)(\\d\\d)".r
Date: scala.util.matching.Regex = (\d\d\d\d)(\d\d)(\d\d)

scala> "20100903" match { 
     |    case Date(year, month, day) => year + "-" + month + "-" + day 
     | }
res1: java.lang.String = 2010-09-03

答案 3 :(得分:2)

val field1="20100903"
val field2="100925"
val year = field1.substring(1,5)
val month = field1.substring(5,7)
val day = ...
...
val toYodaTime = year + "-" + month+"-"+day+ ...