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

Kotlin开发:如何将ISO格式日期时间转换为指定显示格式?

问题分析

你遇到的IllegalArgumentException有两个核心原因:

  1. SimpleDateFormat.format()方法要求传入Date对象,你直接传入字符串类型的日期值,不符合方法参数要求;
  2. 你既没有先将服务器返回的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 05:26:27