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