为什么不正确地将字符串转换为日期?

时间:2019-01-14 14:47:02

标签: datetime kotlin

在我的Kotlin代码中:

   const val TS_DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS"
   val ts = responseJsonObject.get("TS").getAsString()
   val tsDate = SimpleDateFormat(TS_DATE_PATTERN).parse(ts)
   val tsDateAsString = SimpleDateFormat(TS_DATE_PATTERN).format(tsDate)
   logger.info("ts = " + ts + " -> tsDate = " + tsDate + " -> tsDateAsString = " + tsDateAsString)

这是(为便于阅读而格式化)结果:

ts             = 2019-01-14T22:56:30.429582 
tsDate         = Mon Jan 14 23:03:39 EET 2019 
tsDateAsString = 2019-01-14T23:03:39.582

您可以看到 ts tsDateAsString 的时间不同,尽管它们来自同一起点。

例如ts = 22:56:30,但在tsDateAsString = 23:03:39

为什么?

1 个答案:

答案 0 :(得分:2)

建议:只要有可能,请使用java.time-utilities。

SimpleDateFormat具有毫秒的特殊处理方式。 S解析的所有内容均以毫秒为单位。只要您处理3位数毫秒,一切都很好(您甚至可以只使用一个S(即.S)来解析毫秒),但是如果您使用6-数字毫秒作为输入,那么您还将获得6位数毫秒(!)值。

那么6位数毫秒实际上是3位数秒+ 3位数毫秒。那就是偏差的来源。

如何解决?好吧,要么缩短输入时间字符串并降低精度,要么使用首选的DateTimeFormatter来代替与您的输入匹配的模式,即yyyy-MM-dd'T'HH:mm:ss.SSSSSS

val TS_DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSSSS"
val formatter = DateTimeFormatter.ofPattern(TS_DATE_PATTERN)

val tsDate = formatter.parse(ts) // now the value as you would expect it...

将其转换为TimeStamp将如下工作:

Timestamp.valueOf(LocalDateTime.from(tsDate))