You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kotlin中解析带微秒精度的ISO日期?

问题:解析ISO8601格式日期字符串失败

从参考代码中获取的以下Kotlin代码无法运行,抛出解析异常:

val df1: DateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
val string1 = "2022-12-29T19:59:20.783357Z"
val result1: Date = df1.parse(string1)

抛出的异常信息:

Exception in thread "main" java.text.ParseException: Unparseable date:
"2022-12-29T19:59:20.783357Z" at java.text.DateFormat.parse (:-1)
at FileKt.main (File.kt:13) at FileKt.main (File.kt:-1)

注:该日期字符串是有效的ISO8601格式,其中783为毫秒,357为微秒,且无法使用Instant.parse(date)方法。


错误原因

  1. 小数秒格式不匹配:原格式中的SSS仅能匹配3位毫秒值,但输入的日期字符串包含6位小数秒(毫秒+微秒),导致解析时无法匹配;
  2. 时区格式不匹配:原格式中的Z对应RFC 822标准的时区格式(如+0800),无法识别输入中代表UTC的Z缩写。

解决方案

方案1:使用支持UTC缩写的格式字符串(Java 7及以上)

调整SimpleDateFormat的格式字符串,用SSSSSS匹配6位小数秒,用X匹配UTC时区缩写Z:

val df1: DateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSX")
val string1 = "2022-12-29T19:59:20.783357Z"
val result1: Date = df1.parse(string1)

方案2:兼容低版本Java(替换时区标识)

如果Java版本不支持X格式符,可以将日期字符串中的Z替换为+0000,同时调整格式字符串匹配6位小数秒:

val df1: DateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ")
val string1 = "2022-12-29T19:59:20.783357Z".replace("Z", "+0000")
val result1: Date = df1.parse(string1)

注意:SimpleDateFormat是非线程安全的,多线程环境下需谨慎使用。


内容的提问来源于stack exchange,提问作者TSR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:50:16