java SimpleDateFormat解析millis格式错误

时间:2016-06-13 04:16:09

标签: java scala simpledateformat datetime-format

我想用

解析字符串数据"2016-06-08T10:27:17.369000000000Z"
import java.text.SimpleDateFormat

import scala.util.Try
object TimeParse extends App {
  val raw = "2016-06-08T10:27:17.369000000000Z"
  private def parseDate(inputdate: String) = {
    val fromUser = new SimpleDateFormat("""yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSSSSS'Z'""")
    val myFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss")
    Try(myFormat.format(fromUser.parse(inputdate)))
  }

  val r = parseDate(raw)
  println("r - " + r)
}

但输出:
r - Success(2016年06月04日 04:27:29)

如果我删除millis格式,它将是正确的,因为:

object TimeParse extends App {
  val raw = "2016-06-08T10:27:17Z"
  private def parseDate(inputdate: String) = {
    val fromUser = new SimpleDateFormat("""yyyy-MM-dd'T'HH:mm:ss'Z'""")
    val myFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss")
    Try(myFormat.format(fromUser.parse(inputdate)))
  }

  val r = parseDate(raw)
  println("r - " + r)
}

输出:
r - Success(2016年06月08日 10:27:17) 为什么毫秒会得到失败的结果?

1 个答案:

答案 0 :(得分:2)

好吧,SimpleDateFormat不会将秒和毫秒值作为十进制数。

它分别处理它们,因此17.369000000000不是17秒和369毫秒而是17秒和369_000_000_000毫秒。

毫秒值被截断为int,因此被解释为-367_187_456毫秒,这被添加到您的日期值(2016-06-08T10:27:17),因此您获得的是您的实际日期之前的时间戳

另见java.util.Date format SSSSSS: if not microseconds what are the last 3 digits?