最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Java中 JapaneseDate 如何处理日本历法日期
时间:2026-07-21 09:20:59 编辑:袖梨 来源:一聚教程网
JapaneseDate 是 Java 8 引入的用于表示日本和历的类,基于 ISO 日期与年号系统双向映射,支持解析、格式化、计算及时区操作;它是 LocalDate 在日本年号下的视图,不改变时间点仅转换表达方式,自动处理年号更替边界。
JapaneseDate 是 Java 8 引入的 java.time.chrono 包中的一个类,专门用于表示和操作日本和历(如“令和”“平成”“昭和”等)日期。它不是简单字符串替换,而是基于 ISO 历法与日本年号系统的双向映射,支持解析、格式化、计算和时区感知操作。
理解 JapaneseDate 的底层逻辑
JapaneseDate 实际上是 ISO 日历日期(LocalDate)在“日本年号历法”下的视图。它不改变底层时间点,只改变年号+年份的表达方式。例如:
-
JapaneseDate.of(2024, 4, 1)对应“令和6年4月1日”(因为令和元年是2019年5月1日) - 它自动处理年号更替边界:2019-04-30 是“平成31年”,2019-05-01 起才是“令和元年”
- 年份按“元年、2年、3年…”计数,不使用西历年份直接映射
创建 JapaneseDate 的常用方式
不能直接 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"))—— 获取当前日本历日期
格式化 JapaneseDate 为可读字符串
直接调用 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”)
与 LocalDate 互转及注意事项
JapaneseDate 和 LocalDate 可无损互转,但需注意语义差异:
-
localDate.atStartOfDay(ZoneId.of("Asia/Tokyo")).toInstant()再转 JapaneseDate 更可靠(避免时区歧义) -
japaneseDate.toLocalDate()总能获得唯一对应的 ISO 日期 - 不要用
JapaneseDate.get(YEAR)获取西历年——它返回的是年号年份(如令和6年 → 返回6);要用japaneseDate.get(ChronoField.YEAR)或先转 LocalDate - 年号变更日(如2019-05-01)是关键边界,JapaneseDate 内部已内置所有已公布年号起止日期(截至 JDK 21 支持到令和)