Kotlin开发:如何将ISO格式日期时间转换为指定显示格式?
问题分析
你遇到的IllegalArgumentException有两个核心原因:
SimpleDateFormat.format()方法要求传入Date对象,你直接传入字符串类型的日期值,不符合方法参数要求;- 你既没有先将服务器返回的ISO 8601格式日期解析为日期对象,指定的输出格式
dd-MM-yyyy也和目标格式dd.MM.yyyy HH:mm不符。
解决方案
推荐使用Java 8+官方推出的java.time系列API(Kotlin完全兼容,线程安全,无旧API的设计缺陷),以下是两种实现方式:
方式一:推荐使用java.time API(线程安全、简洁)
服务器返回的是标准ISO_INSTANT格式,可直接解析为Instant,再转换为时区时间后格式化:
import java.time.Instant import java.time.ZoneId import java.time.format.DateTimeFormatter // 解析服务器返回的ISO格式日期字符串 val instant = Instant.parse("2022-07-13T07:58:57.835201Z") // 转换为系统默认时区的时间(可替换为指定时区,比如ZoneId.of("Asia/Shanghai")) val zonedDateTime = instant.atZone(ZoneId.systemDefault()) // 定义目标格式 val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm") // 生成最终格式化字符串 val formattedDate = zonedDateTime.format(formatter)
如果不需要时区转换,也可以直接基于UTC时区处理:
import java.time.Instant import java.time.LocalDateTime import java.time.ZoneOffset import java.time.format.DateTimeFormatter val instant = Instant.parse("2022-07-13T07:58:57.835201Z") val localDateTime = LocalDateTime.ofInstant(instant, ZoneOffset.UTC) val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm") val formattedDate = localDateTime.format(formatter)
方式二:修复SimpleDateFormat写法(不推荐,仅兼容旧环境)
SimpleDateFormat存在线程安全问题,仅适用于单线程场景:
import java.text.SimpleDateFormat import java.util.Locale // 定义服务器返回日期的解析格式 val inputPattern = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ" val inputDateFormat = SimpleDateFormat(inputPattern, Locale.getDefault()) // 解析字符串为Date对象 val date = inputDateFormat.parse("2022-07-13T07:58:57.835201Z") // 定义目标输出格式 val outputPattern = "dd.MM.yyyy HH:mm" val outputDateFormat = SimpleDateFormat(outputPattern, Locale.getDefault()) // 格式化Date对象得到结果 val formattedDate = date?.let { outputDateFormat.format(it) }
内容的提问来源于stack exchange,提问作者Kurtca Bain
相关产品推荐
相关产品推荐

