如何在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)方法。
错误原因
- 小数秒格式不匹配:原格式中的
SSS仅能匹配3位毫秒值,但输入的日期字符串包含6位小数秒(毫秒+微秒),导致解析时无法匹配; - 时区格式不匹配:原格式中的
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
相关产品推荐
相关产品推荐

