如何将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
相关产品推荐
相关产品推荐

