JapaneseDate 是 Java 8 引入的用于表示日本和历的类,基于 ISO 日期与年号系统双向映射,支持解析、格式化、计算及时区操作;它是 LocalDate 在日本年号下的视图,不改变时间点仅转换表达方式,自动处理年号更替边界。
JapaneseDate 是 Java 8 引入的 java.time.chrono 包中的一个类,专门用于表示和操作日本和历(如“令和”“平成”“昭和”等)日期。它不是简单字符串替换,而是基于 ISO 历法与日本年号系统的双向映射,支持解析、格式化、计算和时区感知操作。
JapaneseDate 实际上是 ISO 日历日期(LocalDate)在“日本年号历法”下的视图。它不改变底层时间点,只改变年号+年份的表达方式。例如:
JapaneseDate.of(2024, 4, 1) 对应“令和6年4月1日”(因为令和元年是2019年5月1日)不能直接 new,必须通过静态工厂方法构造:
JapaneseDate.of(2024, 4, 1) —— 从西历年月日转换(推荐,安全)JapaneseDate.from(TemporalAccessor) —— 从 LocalDate、ZonedDateTime 等转换JapaneseDate.parse("R6.04.01", DateTimeFormatter.ofPattern("GGGGy.M.d")) —— 解析带年号缩写的字符串(需用正确模式)JapaneseDate.now() 或 JapaneseDate.now(ZoneId.of("Asia/Tokyo")) —— 获取当前日本历日期直接调用 toString() 会输出类似 Japanese Heisei 31-04-30 的格式,但通常需要自定义显示。推荐用 DateTimeFormatter:
立即学习“Java免费学习笔记(深入)”;
DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).withChronology(JapaneseChronology.INSTANCE)
DateTimeFormatter.ofPattern("GGGGy年M月d日", Locale.JAPANESE) → 输出“令和6年4月1日”G 表示纪元(era),y 表示年号下的年份(非西历年),Locale.JAPANESE 启用日语本地化(如“令和”而非“Reiwa”)JapaneseDate 和 LocalDate 可无损互转,但需注意语义差异:
localDate.atStartOfDay(ZoneId.of("Asia/Tokyo")).toInstant() 再转 JapaneseDate 更可靠(避免时区歧义)japaneseDate.toLocalDate() 总能获得唯一对应的 ISO 日期JapaneseDate.get(YEAR) 获取西历年——它返回的是年号年份(如令和6年 → 返回6);要用 japaneseDate.get(ChronoField.YEAR) 或先转 LocalDate