gpt4 book ai didi

android - DateTimeFormatter 和 SimpleDateFormat 使用相同的输入字符串产生不同的结果

转载 作者:行者123 更新时间:2023-12-05 00:18:05 24 4
gpt4 key购买 nike

我们目前正在更换SimpleDateFormatDateTimeFormatter .
在此期间,我遇到了一个奇怪的行为。
以毫秒为单位的差异我无法向自己解释。
这是代码:

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 V.V. 的链接( How to parse date-time with two or three milliseconds digits in java? )提供的解决方案可能会解决我遇到的错误,但它不能回答问题/解释为什么这两个格式化程序会产生不同的结果。

最佳答案

现代,DateTimeFormatter将秒后的数字视为秒的分数,而传统 SimpleDateFormat将秒后的数字视为毫秒数。
让我们看看DateTimeFormatter处理它:

0.09 seconds = 0.09 * 1000 ms = 90 ms
另一方面, SimpleDateFormat将其处理为 09毫秒 = 9毫秒。
顺便说一句,在使用现代日期时间 API 时,您不需要使用 DateTimeFormatter明确解析您的日期时间字符串,因为它已经是 ISO 8601 格式。现代日期时间 API 基于 ISO 8601并且不需要使用 DateTimeFormatter只要日期时间字符串符合 ISO 8601 标准,就可以明确地对象。
演示:
import java.time.Instant;

public class Main {
public static void main(String[] args) {
System.out.println(Instant.parse("2021-09-17T13:37:00.09Z").toEpochMilli());
}
}
输出:
1631885820090
了解更多关于 modern Date-Time API * 来自 Trail: Date Time .

* 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring .请注意,Android 8.0 Oreo 已经提供了 support for java.time .

关于android - DateTimeFormatter 和 SimpleDateFormat 使用相同的输入字符串产生不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69437741/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com