如何在Kotlin中解析带偏移量的日期时间字符串?
解析带时区偏移量的日期时间字符串(Kotlin/SimpleDateFormat)
嗨,我来帮你搞定这个问题!既然Java 8的Instant没法用,咱们就靠SimpleDateFormat来处理这三种带偏移量的日期时间格式。核心思路是针对每种偏移格式定义对应的模式,然后逐个尝试解析,直到找到匹配的那一个。
准备支持的格式模式
咱们需要覆盖你提到的三种偏移情况,所以准备三个模式字符串:
yyyy-MM-dd HH:mm:ssX→ 匹配+02这种仅包含小时的偏移格式yyyy-MM-dd HH:mm:ssXXX→ 匹配+02:30这种带冒号的小时+分钟偏移格式yyyy-MM-dd HH:mm:ssXX→ 匹配+0230这种无冒号的小时分钟连写偏移格式
编写解析工具函数
写一个Kotlin工具函数,遍历这些格式,尝试解析输入的字符串,成功就返回Date对象,所有模式都不匹配就抛出异常。
import java.text.SimpleDateFormat import java.util.Date import java.util.Locale fun parseDateTimeWithOffset(dateStr: String): Date { // 定义所有需要支持的日期格式模式 val supportedPatterns = listOf( "yyyy-MM-dd HH:mm:ssX", "yyyy-MM-dd HH:mm:ssXXX", "yyyy-MM-dd HH:mm:ssXX" ) // 逐个尝试解析 for (pattern in supportedPatterns) { val formatter = SimpleDateFormat(pattern, Locale.ENGLISH) try { return formatter.parse(dateStr) } catch (ignored: Exception) { // 当前模式不匹配,继续尝试下一个 } } // 所有模式都匹配失败,抛出异常 throw IllegalArgumentException("无法解析该日期时间字符串: $dateStr") } // 测试示例 fun main() { val testDates = listOf( "2018-04-01 10:00:00+02", "2018-04-01 10:00:00+02:30", "2018-04-01 10:00:00+0230" ) testDates.forEach { dateStr -> try { val parsedDate = parseDateTimeWithOffset(dateStr) println("✅ 解析成功 '$dateStr' → $parsedDate") } catch (e: IllegalArgumentException) { println("❌ 解析失败: ${e.message}") } } }
关键注意事项
- 指定Locale:一定要加上
Locale.ENGLISH,避免系统默认区域设置的差异导致解析出错(比如部分区域的日期符号规则不同) - 扩展灵活性:如果之后需要支持其他偏移格式,只需要在
supportedPatterns列表里添加对应的模式即可 - 效率优化:可以把常用的模式放在列表前面,减少不必要的尝试次数
内容的提问来源于stack exchange,提问作者Gisela
相关产品推荐
相关产品推荐

