【发布时间】:2021-11-24 23:34:47
【问题描述】:
我们目前正在将SimpleDateFormat 替换为DateTimeFormatter。
在此期间,我遇到了一个奇怪的行为。
毫秒之间存在差异,我无法向自己解释。
代码如下:
val timeString = "2021-09-17T13:37:00.09Z"
val newFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX").withZone(ZoneId.of("UTC"))
val oldFormatter = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.US)
val zonedDateTime = newFormatter.parse(timeString)
val newFormatterDate = Date.from(zonedDateTime.toInstant())
val oldFormatterDate = oldFormatter.parse(timeString)
Assert.assertEquals(newFormatterDate, oldFormatterDate) // false
// newFormatterDate.time is 1631885820090 and
// oldFormatterDate.time is 1631885820009
我在这里发现很多帖子说我们不应该再使用SimpleDateFormat。
但是有人可以向我解释一下这是怎么发生的吗? 我们的代码中是否存在错误或误解了什么?
编辑:@Ole VV 的链接 (How to parse date-time with two or three milliseconds digits in java?) 提供的解决方案可能会解决我遇到的错误,但它不能回答问题/解释为什么这两个格式化程序会产生不同的结果。
【问题讨论】:
-
请注意,您的数据有两位小数秒,而模式有三位。
09解释为三位小数秒时的确切含义是什么?也看看stackoverflow.com/questions/48291776/… -
@Iaalto 谢谢。解决了。如果您想回答而不是评论,我会将其标记为正确的
-
所以简而言之,你的旧代码有一个错误,而新代码没有那个错误。
标签: android simpledateformat datetimeformatter