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

Jetpack Compose中如何格式化带时区偏移的ISO日期字符串?

日期字符串格式化问题解决方法

问题原因

你的代码解析失败的核心问题是:

  • 自定义的解析格式uuuu-MM-dd'T'HH:mm:ss没有包含时区偏移部分(Z或-07:00),无法匹配输入的日期字符串,触发异常后返回原日期。
  • 原代码的格式化逻辑也未实现目标样式(缺少12小时制时间、月份未转全称、日期未补零)。

修正后的代码

@RequiresApi(Build.VERSION_CODES.O)
private fun formatDate(date: String): String {
    return try {
        // 直接解析ISO-8601标准格式的日期字符串,无需手动指定解析模板
        val offsetDateTime = OffsetDateTime.parse(date)
        // 定义目标格式化模板:月份全称 两位日期, 年份 | 12小时制时间+上下午标记
        val targetFormatter = DateTimeFormatter.ofPattern("MMMM dd, uuuu | h:mm a", Locale.ENGLISH)
        val formattedDate = offsetDateTime.format(targetFormatter)
        Log.i("formattedDate", formattedDate)
        formattedDate
    } catch (e: Exception) {
        // 可添加异常日志方便排查:Log.e("DateFormatError", "解析失败: $date", e)
        date
    }
}

关键说明

  1. 自动解析标准格式:输入的2017-04-08T18:39:42Z和2023-04-04T14:01:31-07:00属于ISO-8601标准日期格式,OffsetDateTime.parse(date)可以直接解析,无需自定义解析模板,避免格式不匹配问题。
  2. 目标格式模板详解:
    • MMMM:月份英文全称(如August)
    • dd:两位数字日期(自动补零,如04)
    • uuuu:四位年份
    • h:12小时制小时数(不带前导零,如6)
    • mm:两位数字分钟
    • a:上下午标记(am/pm)
  3. 指定Locale:必须传入Locale.ENGLISH,确保月份和上下午标记为英文,不受系统默认语言影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 18:32:19