Datetime 在Scala2.8中,如何通过子字符串的长度和起始索引访问子字符串?

Datetime 在Scala2.8中,如何通过子字符串的长度和起始索引访问子字符串?,datetime,scala,string,Datetime,Scala,String,我在单独的字段中有日期和时间,分别是yyyyMMdd和HHmmss格式。为了解析它们,我想构造一个yyyy-MM-ddTHH:MM:ss字符串,并将其提供给joda时间构造函数。所以我希望得到1-st 4位,然后从索引5开始得到2位,等等。如何实现这一点?List.fromString(String)(我发现的)似乎已损坏。只需对字符串使用substring()方法即可。请注意,Scala字符串的行为类似于Java字符串(带有一些额外的方法),因此Java.lang.String中的任何内容也可

我在单独的字段中有日期和时间,分别是yyyyMMdd和HHmmss格式。为了解析它们,我想构造一个yyyy-MM-ddTHH:MM:ss字符串,并将其提供给joda时间构造函数。所以我希望得到1-st 4位,然后从索引5开始得到2位,等等。如何实现这一点?List.fromString(String)(我发现的)似乎已损坏。

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

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+ ...
val s = "20100903"
val t = s.substring(0, 4) // t will contain "2010"
(请注意,参数不是长度和起始索引,而是起始索引(包含)和结束索引(排除))

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

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

如果你在使用Joda时间,你应该能够使用

val date = DateTimeFormat.forPattern("yyyyMMdd, HHmmss")
                         .parseDateTime(field1 + ", " + field2)
对于像这样解析字符串的更一般的问题,使用正则表达式可能会有所帮助(尽管在这种情况下我不建议使用正则表达式):


substring
方法当然可以实现这一点,但Scala 2.8中的字符串也支持序列上的所有其他方法。报告给出了一个完整的清单

特别是
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

字符串。子字符串(x)或字符串。子字符串(x,y)嗯,是马丁本人。他的答案很有可能是正确的:p
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