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

