MinguoDate是Java 8中表示民国纪年的日期类,年份=公历年−1911,仅重映射年份、不改变月日规则;支持of()创建、from()转换、自定义格式化,且与LocalDate无损互转。

MinguoDate 是 Java 8 引入的 java.time.chrono 包中的一个类,专门用于表示中华民国纪年(即“民国年”)的日期,它基于格里高利历(公历)日历系统,但将年份偏移为“民国元年 = 1912 年”。它不改变月、日规则,仅重映射年份表达方式。
理解 MinguoDate 的年份映射逻辑
民国纪年以 1912 年中华民国成立为元年,因此:
- 民国 1 年 → 公历 1912 年
- 民国 113 年 → 公历 2024 年(因为 1912 + 113 − 1 = 2024)
- 换算公式:公历年 = 民国年 + 1911;民国年 = 公历年 − 1911
注意:MinguoDate 本身不支持“民国前”年份(如民国前1年=1911年),其最小年份为民国1年(1912-01-01),且所有月份和日期规则完全等同于公历(无农历转换、无闰月处理)。
创建和解析 MinguoDate 实例
可通过静态工厂方法创建,也可从 LocalDate 转换:
立即学习“Java免费学习笔记(深入)”;
- 直接构造:
MinguoDate.of(113, 5, 20)→ 民国 113 年 5 月 20 日(即 2024-05-20) - 从 LocalDate 转换:
MinguoDate.from(LocalDate.of(2024, 5, 20)) - 解析字符串(需搭配 DateTimeFormatter):
DateTimeFormatter.ofPattern("yyyy-MM-dd").withChronology(MinguoChronology.INSTANCE).parse("113-05-20", MinguoDate::from)
格式化与输出民国年份
默认 toString() 输出形如 MinguoDate: Minguo 113-05-20。如需自定义格式(如“113年5月20日”),需指定中文 locale 和自定义 pattern:
DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy年M月d日", Locale.CHINA).withChronology(MinguoChronology.INSTANCE);String s = f.format(MinguoDate.of(113, 5, 20)); // → "113年5月20日"
注意:pattern 中的 yyyy 在 MinguoChronology 下自动按民国年渲染,无需手动减 1911。
与 LocalDate 互转及注意事项
MinguoDate 和 LocalDate 是同一时间点的不同纪年视图,转换是无损的:
-
LocalDate ld = minguoDate.atDate(ZoneId.systemDefault()).toLocalDate();(推荐用minguoDate.toLocalDate()更简洁) MinguoDate md = MinguoDate.from(localDate);- 时区无关:MinguoDate 是纯日期类型,不含时间与时区信息
- 不处理农历或节气:它不是“民国农历”,只是公历日期的民国年表述
若业务需支持台湾地区常用格式(如“中華民國113年5月20日”),建议组合使用 MinguoChronology 与自定义 formatter,并注意 locale 设置为 Locale.TAIWAN 可影响部分本地化文本(如星期名)。


















