解析自定义Java日期因缺年份报错,能否设置默认年份?
问题原因
你遇到的异常核心原因是:LocalDateTime要求必须包含年、月、日、时分完整的日期时间组件,但你的格式串"h:mm a z - d MMMM"和输入文本里都没有年份信息,解析后得到的TemporalAccessor只包含日、月、时间和时区,缺少年份,因此无法构建出LocalDateTime对象。
解决方案:设置默认年份
通过DateTimeFormatterBuilder的parseDefaulting方法,为年份字段指定默认值即可解决。具体代码修改如下:
// 构建格式化器时添加默认年份 DateTimeFormatter formatter2 = new DateTimeFormatterBuilder() .appendPattern("h:mm a z - d MMMM") // 设置默认年份,这里用2024作为示例,也可以用当前年份 .parseDefaulting(ChronoField.YEAR, 2024) .toFormatter() .withLocale(Locale.US); String test = "7:00 PM EST - 14 April"; LocalDateTime date2 = LocalDateTime.parse(test, formatter2); System.out.println(date2); // 输出:2024-04-14T19:00
如果想要动态使用当前年份,可以替换成:
.parseDefaulting(ChronoField.YEAR, Year.now().getValue())
补充说明
另外需要注意:输入里的时区(EST)会被解析,但LocalDateTime本身不包含时区信息,解析时时区仅用于确定时间的偏移(比如EST转成UTC的时间),最终构建的LocalDateTime还是不带时区的本地时间。如果需要保留时区信息,可以考虑使用ZonedDateTime来解析。
内容的提问来源于stack exchange,提问作者erotsppa
相关产品推荐
相关产品推荐

