将带时区的字符串时间戳转为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
相关产品推荐
相关产品推荐

