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

Kotlin/Java中如何将日期时间字符串转换为Instant实例?

错误原因

你使用的DateTimeFormatter.ISO_OFFSET_DATE_TIME要求输入的时间字符串必须携带时区偏移信息(格式示例:2021-11-25T15:20:00+08:00),而你拼接得到的2021-11-25T15:20:00仅包含本地日期时间,没有时区偏移字段,因此解析到索引19(字符串末尾位置)时无法匹配格式,抛出异常。

正确实现方案

方案1:先解析为LocalDateTime再绑定时区

这种方式逻辑最直观,不易出错:

import java.time.LocalDateTime
import java.time.ZoneId
import java.time.format.DateTimeFormatter

val date = "2021-11-25"
val time = "15:20"
val dateTimeStr = "${date}T${time}:00"
// 先解析为不带时区的本地日期时间
val localDateTime = LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ISO_LOCAL_DATE_TIME)
// 绑定对应时区后转换为Instant,示例用系统默认时区,也可指定固定时区如ZoneId.of("Asia/Shanghai")
val instantDateTime = localDateTime.atZone(ZoneId.systemDefault()).toInstant()

方案2:直接使用带时区配置的Formatter解析

如果你不想单独处理LocalDateTime,也可以直接用适配无偏移格式的Formatter指定时区后解析:

import java.time.Instant
import java.time.ZoneId
import java.time.format.DateTimeFormatter

val date = "2021-11-25"
val time = "15:20"
val dateTimeStr = "${date}T${time}:00"
// 使用适配本地日期时间的Formatter,提前绑定时区
val formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME.withZone(ZoneId.systemDefault())
val instantDateTime = Instant.from(formatter.parse(dateTimeStr))
注意事项
  • 时区建议根据业务需求明确指定,不要无脑依赖系统默认时区,避免服务部署在不同时区环境时出现时间偏移问题。
  • 如果你的时间字符串拼接逻辑固定,也可以自定义DateTimeFormatter直接拆分解析日期和时间字段,无需手动拼接字符串,降低格式出错概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:24:06