You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解析自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 05:22:27