使用yyyyMMddHHmmssZ解析时间报错:无法获取OffsetDateTime
解决OffsetDateTime严格模式下解析时间字符串的异常
嘿,我来帮你排查这个时间解析的问题~
你遇到的DateTimeParseException,核心原因出在**严格解析模式(STRICT)**下DateTimeFormatter对年份模式的处理逻辑上:
- 你用的
yyyy代表的是「年时代(YearOfEra)」,它是基于纪年时代(比如公元前后)的年份表示; - 而
OffsetDateTime在严格模式下,需要的是明确的「公元年(Year)」标识。
虽然在公元纪年里这两个数值看起来完全一样,但严格解析器不会自动将YearOfEra转换为Year,导致解析后的TemporalAccessor缺少构建OffsetDateTime所需的明确年份信息,最终抛出异常。
解决方案
把格式模式里的yyyy替换成uuuu就可以解决问题了。uuuu是Java时间API中专门用来表示公元年的模式符,在严格模式下能被OffsetDateTime正确识别。
修正后的代码如下:
import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; import java.time.format.ResolverStyle; import java.time.chrono.IsoChronology; public class Main { public static void main(String[] args) { System.out.println("********************" + OffsetDateTime .parse("20140726080320+0400", DateTimeFormatter.ofPattern("uuuuMMddHHmmssZ") .withChronology(IsoChronology.INSTANCE) .withResolverStyle(ResolverStyle.STRICT)) .toEpochSecond()); } }
补充说明
如果你不需要这么严格的解析规则,把解析器风格改成ResolverStyle.SMART或者ResolverStyle.LENIENT也能绕过这个问题。但既然你明确指定了STRICT模式,用uuuu替换yyyy是最符合规范的解决方式,能保证严格解析的正确性。
内容的提问来源于stack exchange,提问作者Gaurav
相关产品推荐
相关产品推荐

