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

Java如何将'2021-08-03T10:00:00EDT'解析为ZonedDateTime及报错原因

报错原因

  • 你定义的格式化器使用z作为时区短名称匹配符,而EDT是英文体系的夏令时时区缩写,默认创建的DateTimeFormatter会使用JVM的默认Locale进行解析,如果你的运行环境默认Locale不是英文,就无法识别EDT标识,这也是报错提示解析失败位置在索引19的原因:索引19刚好是EDT的第一个字符位置。
  • 部分时区短名称本身存在多义性,默认解析规则下也可能触发识别失败问题。

正确解析方法

最通用的解决方案是创建格式化器时显式指定英文Locale,即可正常识别EDT等英文时区缩写:

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

// 显式指定Locale.US创建格式化器
private static final DateTimeFormatter DATE_TIME_FORMATTER
        = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssz", Locale.US);

// 解析调用示例
ZonedDateTime result = ZonedDateTime.parse("2021-08-03T10:00:00EDT", DATE_TIME_FORMATTER);

额外注意

时区短名称存在天然的歧义问题,例如CST可以同时指代中国标准时间、美国中部标准时间等多个时区,所以如果能控制输入格式,更推荐使用UTC偏移量(如+04:00)或者标准时区ID(如America/New_York)来传递时区信息,避免解析出现不符合预期的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:27:04