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

Iva*_*van 3 string datetime scala

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

Mar*_*sky 15

substring方法当然可以帮助您,但Scala 2.8中的String也支持序列上的所有其他方法.本类StringOps ScalaDoc给出了完整的列表.

特别是,该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
Run Code Online (Sandbox Code Playgroud)


Jes*_*per 8

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

val s = "20100903"
val t = s.substring(0, 4) // t will contain "2010"
Run Code Online (Sandbox Code Playgroud)

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

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

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


Aar*_*rup 7

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

val date = DateTimeFormat.forPattern("yyyyMMdd, HHmmss")
                         .parseDateTime(field1 + ", " + field2)
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)