在我的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
为什么?
答案 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))