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

Java8如何正确解析带偏移量的日期时间字符串

报错原因

Java 8 中OffsetDateTime.parse(CharSequence)方法默认使用ISO_OFFSET_DATE_TIME标准格式化器解析字符串,该格式化器强制要求时区偏移量的小时部分为2位数字(比如-05:00才符合要求)。传入的时间字符串偏移量为-5:00,小时位仅1位数字,因此在偏移量起始的索引16位置抛出解析异常。

最简实现方案

直接用JDK原生的DateTimeFormatterBuilder自定义格式化规则即可,不需要引入第三方依赖,也不需要做硬编码的字符串拼接/替换,同时还能兼容1位、2位小时偏移量的混合场景:

import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;

public class TimeParseTest {
    public static void main(String[] args) {
        // 构建支持1位小时偏移量的格式化器
        DateTimeFormatter flexibleFormatter = new DateTimeFormatterBuilder()
                // 先解析前缀的日期时间部分,兼容ISO标准的本地日期时间格式
                .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
                // 配置偏移量解析规则,支持+/-H:mm、+/-HH:mm格式
                .appendOffset("+H:mm", "Z")
                .toFormatter();

        OffsetDateTime sourceDateTime = OffsetDateTime.parse("2019-08-07T19:20-5:00", flexibleFormatter);
        // 验证结果
        System.out.println(sourceDateTime.getOffset()); // 输出 -05:00
        System.out.println(sourceDateTime); // 输出 2019-08-07T19:20-05:00
    }
}
注意事项
  • 不建议使用正则替换、字符串补零这类硬编码逻辑处理时间字符串,一旦源系统输出的偏移量格式出现变动(比如出现+5:30、-05:00这类格式),硬编码逻辑很容易触发解析错误。
  • 上述实现完全基于Java 8原生的java.time包API,没有任何额外依赖,性能和稳定性都有保障。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:48:21