Java 8 的 java.time API 原生支持 ISO-8601 字符串解析,推荐直接使用 LocalDateTime.parse()、OffsetDateTime.parse()、ZonedDateTime.parse() 或 Instant.parse() 等静态方法;需严格匹配类型与格式——纯时间用 LocalDateTime,带偏移用 OffsetDateTime/ZonedDateTime,带区域 ID 用 ZonedDateTime,UTC 时间用 Instant;优先选用 DateTimeFormatter.ISO_XXX 预定义常量而非手写 pattern,避免 DateTimeParseException 和 UnsupportedTemporalTypeException。

Java 8 的 java.time API 提供了对 ISO-8601 标准字符串的原生支持,大多数常见格式无需手动指定模式即可直接解析。
直接使用内置解析器(推荐)
LocalDateTime、ZonedDateTime、Instant 等类都内置了符合 ISO-8601 的静态解析方法:
-
LocalDateTime.parse("2023-05-12T14:30:45")→ 解析不含时区的本地日期时间 -
ZonedDateTime.parse("2023-05-12T14:30:45+08:00")→ 自动识别带偏移的时区时间 -
ZonedDateTime.parse("2023-05-12T14:30:45Z")→Z表示 UTC,等价于+00:00 -
ZonedDateTime.parse("2023-05-12T14:30:45.123+08:00[Asia/Shanghai]")→ 支持带区域 ID 的完整格式 -
Instant.parse("2023-05-12T06:30:45.123Z")→ 直接解析为 UTC 时间点
注意时区与类型匹配
ISO 字符串是否含时区信息,决定了该用哪个类型解析:
- 纯日期时间(如
"2023-05-12T14:30")→ 用LocalDateTime;它不表示具体时刻,不能直接转Instant - 带偏移(如
"+08:00"或"Z")→ 用OffsetDateTime或ZonedDateTime - 带区域 ID(如
"[Europe/London]")→ 必须用ZonedDateTime,OffsetDateTime不支持
需要自定义格式时用 DateTimeFormatter.ISO_XXX 常量
标准库已预定义多个常用 ISO 格式常量,比手写 pattern 更安全:
立即学习“Java免费学习笔记(深入)”;
-
DateTimeFormatter.ISO_LOCAL_DATE_TIME→"2023-05-12T14:30:45" -
DateTimeFormatter.ISO_OFFSET_DATE_TIME→"2023-05-12T14:30:45+08:00" -
DateTimeFormatter.ISO_ZONED_DATE_TIME→"2023-05-12T14:30:45+08:00[Asia/Shanghai]" -
DateTimeFormatter.ISO_INSTANT→ 专为Instant设计,要求必须含Z或+xx:xx
用法示例:LocalDateTime.parse(str, DateTimeFormatter.ISO_LOCAL_DATE_TIME)
常见解析异常与避坑
解析失败通常因格式不严格匹配 ISO-8601 或类型误用:
-
DateTimeParseException:字符串多空格、少冒号、秒数带多余小数位(如.1234超过三位)、时区写成GMT+8(非 ISO) -
UnsupportedTemporalTypeException:用LocalDateTime.parse()去解析带Z的字符串 → 改用Instant或ZonedDateTime - 含毫秒但未对齐:ISO 允许 0–9 位小数秒,但
LocalDateTime默认只接受最多 9 位,实际兼容性良好;若需截断或补零,可先 normalize 字符串或用 formatter 显式控制


















