You need to enable JavaScript to run this app. Java如何解析yyyy-MM-ddTHH:mm:ss.SSS+ZZZZ格式UTC时间戳转java.sql.Timestamp
优惠活动
大模型
产品
解决方案
定价
更多

Java如何解析yyyy-MM-ddTHH:mm:ss.SSS+ZZZZ格式UTC时间戳转java.sql.Timestamp

报错与时间偏移的核心原因
  • java.sql.Timestamp.valueOf() 仅支持直接解析格式为 yyyy-MM-dd HH:mm:ss[.纳秒] 的本地时间字符串,你的输入串包含T分隔符、毫秒值、以及末尾无冒号的UTC时区偏移段(+0000),完全不符合入参格式要求,因此会在偏移字段所在的解析位置抛出DateTimeParseException。
  • 之前尝试的方案出现时间偏移,本质是解析过程触发了隐式时区换算:代码默认按运行环境的系统时区(比如国内服务器的东八区)转换带偏移的时间值,没有固定按字符串自带的UTC偏移规则解析,最终导致原始UTC时间05:35被加8小时变成11:05。
适配带+0000偏移格式的无偏移解析方案

Java 8及以上版本可直接通过内置时间API精准匹配你的入参格式,全程不做隐式时区转换,保证最终Timestamp实例和字符串表示的UTC时间完全对应:

  1. 入参格式匹配规则:你的输入串结构为 日期T时间.毫秒 4位无冒号时区偏移,对应解析格式占位符为 yyyy-MM-dd'T'HH:mm:ss.SSSXXXX,其中XXXX专门适配不带冒号的4位时区偏移(比如+0000、+0530),刚好覆盖你提到的398+0000格式段。
  2. 解析流程:先解析带偏移的时间对象,再统一转换为UTC时区下的本地时间值,最后生成java.sql.Timestamp实例。

可直接运行的示例代码:

String rawTimeStr = "2020-12-03T05:35:59.398+0000";
// 构造和输入完全匹配的解析器
DateTimeFormatter timeFormatter = new DateTimeFormatterBuilder()
        .appendPattern("yyyy-MM-dd'T'HH:mm:ss.SSS")
        .appendPattern("XXXX")
        .toFormatter();
// 按字符串自带的偏移信息解析时间,不触发系统时区换算
OffsetDateTime parsedTime = OffsetDateTime.parse(rawTimeStr, timeFormatter);
// 生成目标Timestamp实例,最终值为2020-12-03 05:35:59.398
Timestamp targetTimestamp = Timestamp.valueOf(
        parsedTime.atZoneSameInstant(ZoneOffset.UTC).toLocalDateTime()
);
常见避坑点
  • 若使用老版本SimpleDateFormat做解析,必须显式设置时区为UTC:调用format.setTimeZone(TimeZone.getTimeZone("UTC")),否则会默认按系统时区换算,必然出现时间偏移问题。
  • 不要直接将字符串中的T替换为空格后传入Timestamp.valueOf():这种做法会丢失末尾的时区偏移信息,要么触发格式解析报错,要么因为时区处理逻辑不一致出现值偏差。
  • 若流式场景下遇到毫秒位数不固定的输入(可能为1-3位小数),可将格式中的.SSS调整为宽松匹配规则,避免因小数位长度不一致触发解析异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.15 07:36:04