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

如何将yyyy/MM/dd格式日期转换为dd/MM/yyyy?现有Kotlin函数运行报错

报错原因
  • 输入的实际日期格式与解析模板不匹配:错误日志显示你实际传入函数的日期是2021-11-18T23:39:45.000Z,属于ISO 8601标准UTC时间格式,既不是你预期的yyyy/MM/dd格式,也和你代码中用于解析的dd/MM/yyyy模板完全不符,触发解析异常。
  • 解析和格式化共用同一模板逻辑错误:即使你输入的是预期的yyyy/MM/dd格式字符串,用dd/MM/yyyy模板解析也会失败,比如输入2024/05/20时,解析逻辑会把2024识别为日期,超出合法日期的最大取值范围,加上你开启了isLenient = false非宽松校验,会直接抛出异常。
  • 代码存在空指针风险:你用!!强制将parse()的可空返回值转成非空,一旦解析失败返回null,会直接触发空指针崩溃。
修复方案

场景1:输入确实为yyyy/MM/dd格式字符串

需要分别定义解析用模板、格式化用模板,同时增加异常捕获避免崩溃:

import java.text.SimpleDateFormat
import java.util.*

fun convertTime(date: String): String? {
    // 解析模板与输入格式匹配
    val parseFormatter = SimpleDateFormat("yyyy/MM/dd", Locale("pt", "BR"))
    parseFormatter.isLenient = false
    // 格式化模板为目标输出格式
    val targetFormatter = SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR"))
    return try {
        val parsedDate = parseFormatter.parse(date)
        parsedDate?.let { targetFormatter.format(it) }
    } catch (e: Exception) {
        e.printStackTrace()
        // 解析失败可返回空或自定义默认值
        null
    }
}

场景2:实际输入为错误日志中的ISO 8601格式时间

推荐使用更安全的java.time系列API(SimpleDateFormat存在线程安全问题,Android 8.0及以上原生支持,低版本可开启核心库脱糖兼容):

import java.time.format.DateTimeFormatter
import java.time.LocalDateTime
import java.time.ZoneOffset
import java.util.*

fun convertTime(isoDateStr: String): String? {
    return try {
        // 解析ISO 8601格式时间
        val dateTime = LocalDateTime.parse(isoDateStr, DateTimeFormatter.ISO_DATE_TIME)
        // 定义目标格式模板
        val targetFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy", Locale("pt", "BR"))
        // 转换为UTC时区输出目标格式
        dateTime.atOffset(ZoneOffset.UTC).format(targetFormatter)
    } catch (e: Exception) {
        e.printStackTrace()
        null
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:54:04