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

Java中DateTimeFormatter解析日本和历日期返回无效结果如何修复

问题根源

解析错误由两个原因导致:

  1. 直接使用yy作为年份匹配符时,Java默认按公历规则补全两位年份,会将01识别为公历2001年,与输入的平成纪元年份范围冲突,STRICT/SMART模式下直接校验失败,LENIENT模式下会强制偏移到最新的令和纪元计算,最终得到错误结果。
  2. 没有显式指定年份为和历纪元相对年份(YEAR_OF_ERA),导致解析器没有按照和历规则处理年份数字。
解决方法

使用DateTimeFormatterBuilder显式定义和历年的解析规则,示例代码如下:

import java.time.chrono.JapaneseChronology;
import java.time.chrono.JapaneseDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.ResolverStyle;
import java.time.temporal.ChronoField;
import java.util.Locale;

public class JapaneseDateParseDemo {
    public static void main(String[] args) {
        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                // 匹配和历纪元名称(平成、令和等)
                .appendPattern("G")
                // 显式指定为和历纪元相对年份,固定匹配2位数字
                .appendValue(ChronoField.YEAR_OF_ERA, 2)
                // 匹配后续的月日部分
                .appendPattern("年MM月dd日")
                // 指定本地化环境为日本,确保纪元名称匹配正确
                .toFormatter(Locale.JAPAN)
                .withChronology(JapaneseChronology.INSTANCE)
                .withResolverStyle(ResolverStyle.STRICT);
        
        JapaneseDate date = JapaneseDate.from(formatter.parse("平成01年01月01日"));
        // 输出:Japanese Heisei 1-01-01
        System.out.println(date);
        // 输出:平成01年01月01日
        System.out.println(date.format(formatter));
    }
}
补充说明
  • 如果需要同时支持平成元年这种写法,可以额外配置YEAR_OF_ERA的文本映射,将1对应为“元年”即可。
  • 如果输入的年份位数不固定(可能是1位、2位或者更多),可以将appendValue(ChronoField.YEAR_OF_ERA, 2)修改为appendValue(ChronoField.YEAR_OF_ERA, 1, 4, SignStyle.NORMAL),适配1到4位的年份输入,使用时需要导入java.time.format.SignStyle类。

内容的提问来源于stack exchange,提问作者user17223316

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:24:04