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

将带时区的字符串时间戳转为Scala Timestamp时抛出解析异常

问题分析与解决方案

你的问题出在日期格式字符串和输入的时间字符串不匹配,导致解析失败。咱们一步步拆解:

错误原因

你的输入字符串是2017-12-14T09:54:52.662-06:00,末尾的-06:00是时区偏移量(表示比UTC晚6小时)。但你定义的格式"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"里,'Z'是一个字面量字符匹配——它会要求输入字符串必须以字符Z结尾,而不是实际的时区偏移值,这就直接导致了解析异常。

修复方案

方案1:修正SimpleDateFormat的格式字符串

把格式字符串中的'Z'替换成XXX,这个模式符专门用来匹配±HH:mm格式的时区偏移:

val s = "2017-12-14T09:54:52.662-06:00"
val format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
val ts = new Timestamp(format.parse(s).getTime)

⚠️ 注意:SimpleDateFormat是线程不安全的,如果你的代码运行在多线程环境中,要避免共享同一个实例,或者用ThreadLocal做线程隔离包装。

方案2:使用Java 8+的java.time API(推荐)

Java 8引入的java.time包是线程安全、设计更合理的时间处理API,完全可以替代老旧的SimpleDateFormat和Timestamp。而且它默认支持ISO 8601格式的时间字符串,不需要手动写格式:

import java.time.OffsetDateTime
import java.sql.Timestamp

val s = "2017-12-14T09:54:52.662-06:00"
// 直接解析带时区偏移的时间字符串
val odt = OffsetDateTime.parse(s)
// 转换为java.sql.Timestamp
val ts = Timestamp.from(odt.toInstant)

这个方法更简洁,也避免了手动维护格式字符串的麻烦,是当前推荐的时间处理方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:50:28