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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:30:24