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
相关产品推荐
相关产品推荐

