Android中如何将输入日期转换为指定的新日期格式?
解决方案:用Java 8+日期API处理格式转换
别再用SimpleDateFormat了,它不仅线程不安全,处理你这种标准UTC日期格式还极易踩坑。推荐使用Java 8引入的日期时间API(Android上可通过Desugar或三方库支持),具体步骤如下:
1. 配置项目支持新日期API
方法一:启用Core Library Desugaring(Android Gradle Plugin 4.0+)
在模块级build.gradle中添加配置:
android { compileOptions { coreLibraryDesugaringEnabled true sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' }
方法二:用ThreeTenABP(兼容Android 8.0以下)
添加依赖:
dependencies { implementation 'com.jakewharton.threetenabp:threetenabp:1.4.2' }
并在自定义Application的onCreate中初始化:
override fun onCreate() { super.onCreate() ThreeTenABP.init(this) }
2. 具体转换代码
步骤1:解析UTC输入字符串
输入的2023-11-20T17:09:08.000Z是标准ISO 8601 UTC格式,直接用Instant.parse()解析即可:
import java.time.Instant import java.time.ZoneId import java.time.ZonedDateTime import java.time.format.DateTimeFormatter import java.util.Locale // 解析输入的UTC日期 val inputUtcDate = Instant.parse("2023-11-20T17:09:08.000Z") // 转换为设备本地时区的日期时间 val localDateTime = inputUtcDate.atZone(ZoneId.systemDefault())
步骤2:格式化目标样式(带序数词如2nd、1st)
默认的DateTimeFormatter不支持日期序数词,需要手动处理:
// 生成日期序数词后缀的工具函数 fun getOrdinalSuffix(day: Int): String { return when { day in 11..13 -> "th" day % 10 == 1 -> "st" day % 10 == 2 -> "nd" day % 10 == 3 -> "rd" else -> "th" } } // 分别格式化各部分再拼接 val timePart = DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH) .format(localDateTime) .lowercase() // 转为小写的am/pm val dayPart = "${localDateTime.dayOfMonth}${getOrdinalSuffix(localDateTime.dayOfMonth)}" val monthYearPart = DateTimeFormatter.ofPattern("MMMM yyyy", Locale.ENGLISH) .format(localDateTime) // 最终结果 val formattedDate = "$timePart, $dayPart $monthYearPart" // 示例输出:5:09 pm, 20th November 2023
关键说明
- 必须指定
Locale.ENGLISH,避免不同地区的月份名称、am/pm显示不符合需求 - 新日期API是线程安全的,比
SimpleDateFormat更可靠,也不需要手动编写复杂的解析格式字符串
内容的提问来源于stack exchange,提问作者Devrath
相关产品推荐
相关产品推荐

