如何解析格式为2020-02-11T17:26:31-05:00的日期时间?
解决带时区偏移的日期解析问题
首先得明确:你拿到的日期字符串2020-02-11T17:26:31-05:00是标准ISO 8601带UTC偏移量的日期时间格式,末尾的-05:00代表比UTC时间晚5小时的时区偏移,不是毫秒或其他特殊格式。
你的代码有两个核心问题导致解析失败:
- 自定义的格式模式完全不匹配目标日期结构
- 误用了不支持时区/偏移量的
LocalDateTime类
正确的解析方案
方案1:用内置ISO格式(推荐,无需手动写模式)
Java 8+的DateTimeFormatter已经内置了对应这种格式的解析器,直接调用就行,同时要用OffsetDateTime接收结果(它专门处理带偏移量的日期时间):
String otmmResponseDate = "2020-02-11T17:26:31-05:00"; // 更简洁的写法:OffsetDateTime本身就支持解析这种标准格式,无需显式指定Formatter OffsetDateTime responseDateTime = OffsetDateTime.parse(otmmResponseDate); // 也可以显式指定内置Formatter,效果一致 // OffsetDateTime responseDateTime = OffsetDateTime.parse(otmmResponseDate, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
方案2:手动指定正确的格式模式
如果你一定要自定义模式,注意这几点:
- 去掉多余的
SSS(你的日期里没有毫秒部分) - 删掉末尾的
'Z'(你的日期结尾是偏移量-05:00,没有Z字符) - 依然要用
OffsetDateTime而非LocalDateTime
代码示例:
String otmmResponseDate = "2020-02-11T17:26:31-05:00"; DateTimeFormatter responseFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH); OffsetDateTime responseDateTime = OffsetDateTime.parse(otmmResponseDate, responseFormatter);
原代码报错的原因
- 模式里的
SSS对应毫秒,但你的日期字符串没有毫秒段,解析时会找不到对应内容抛出异常 - 模式末尾的
'Z'强制要求字符串以Z结尾,可你的日期是-05:00结尾,格式不匹配 LocalDateTime是不带时区/偏移信息的类型,根本无法解析包含偏移量的日期字符串,必须用支持偏移的OffsetDateTime或ZonedDateTime
内容的提问来源于stack exchange,提问作者ankur jadiya
相关产品推荐
相关产品推荐

