Java中DateTimeFormatter解析日本和历日期返回无效结果如何修复
问题根源
解析错误由两个原因导致:
- 直接使用
yy作为年份匹配符时,Java默认按公历规则补全两位年份,会将01识别为公历2001年,与输入的平成纪元年份范围冲突,STRICT/SMART模式下直接校验失败,LENIENT模式下会强制偏移到最新的令和纪元计算,最终得到错误结果。 - 没有显式指定年份为和历纪元相对年份(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
相关产品推荐
相关产品推荐

