diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/date/chinese/ChineseDate.java b/hutool-core/src/main/java/org/dromara/hutool/core/date/chinese/ChineseDate.java index 6f23046fd..d1122b025 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/date/chinese/ChineseDate.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/date/chinese/ChineseDate.java @@ -377,6 +377,79 @@ public class ChineseDate { return null; } + /** + * 农历标准化输出格式枚举 + */ + public enum ChineseDateFormat{ + + /** + * 干支纪年 数序纪月 数序纪日 + */ + GSS("干支纪年 数序纪月 数序纪日"), + /** + * 生肖纪年 数序纪月 数序纪日 + */ + XSS("生肖纪年 数序纪月 数序纪日"), + /** + * 干支纪年 数序纪月 干支纪日 + */ + GSG("干支纪年 数序纪月 干支纪日"), + /** + * 农历年年首所在的公历年份 干支纪年 数序纪月 数序纪日 + */ + Mix("农历年年首所在的公历年份 干支纪年 数序纪月 数序纪日"); + + /** + * 农历标准化输出格式信息 + */ + private final String info; + + /** + * 构造 + * + * @param info 输出格式信息 + */ + ChineseDateFormat(final String info) { + this.info = info; + } + + /** + * 获取农历日期输出格式相关描述 + * + * @return 输出格式信息 + */ + public String getName() { + return this.info; + } + } + + /** + *获取标准化农历日期,默认Mix + * + * @return 获取的标准化农历日期 + */ + public String getNormalizedDate() { + return getNormalizedDate(ChineseDateFormat.Mix); + } + + /** + * 获取标准化农历日期 + * 支持格式 + *
    GSS 干支纪年 数序纪月 数序纪日 + *
  1. XSS 生肖纪年 数序纪月 数序纪日
  2. + *
  3. GSG 干支纪年 数序纪月 干支纪日
  4. + *
  5. Mix 农历年年首所在的公历年份 干支纪年 数序纪月 数序纪日
  6. + *
+ * @param format 选择输出的标准格式 + * @return 获取的标准化农历日期 + */ + public String getNormalizedDate(final ChineseDateFormat format) { + if (gyear >= LunarInfo.BASE_YEAR && gmonthBase1 > 0 && gday > 0) { + return normalized(gyear, gmonthBase1, gday, format); + } + return null; + } /** * 获得节气 @@ -439,6 +512,46 @@ public class ChineseDate { GanZhi.getGanzhiOfDay(year, month, day)); } + /** + * 获取不同格式的标准化农历日期输出 + * + * @param year 公历年 + * @param month 公历月 + * @param day 公历日 + * @param format 农历输出格式 + * @return 标准化农历日期输出 + */ + private String normalized(final int year, final int month, final int day, final ChineseDateFormat format) { + //根据选择的格式返回不同标准化日期输出,默认为Mix + String normalizedYear = ""; + String normalizedMonth = getChineseMonth(); + String normalizedDay = ""; + CharSequence dateTemplate = "农历{}年{}{}"; + + switch (format){ + case Mix: + dateTemplate = "公元"+ year +"年农历{}年{}{}"; + case GSS: + normalizedYear = GanZhi.getGanzhiOfYear(this.year); + normalizedDay = getChineseDay(); + break; + case XSS : + normalizedYear = getChineseZodiac(); + normalizedDay = getChineseDay(); + break; + case GSG: + dateTemplate = "农历{}年{}{}日"; + normalizedYear = GanZhi.getGanzhiOfYear(this.year); + normalizedDay = GanZhi.getGanzhiOfDay(year, month, day); + break; + } + + return StrUtil.format(dateTemplate, + normalizedYear, + normalizedMonth, + normalizedDay); + } + /** * 通过农历年月日信息 返回公历信息 提供给构造函数 * diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/date/chinese/LunarFestival.java b/hutool-core/src/main/java/org/dromara/hutool/core/date/chinese/LunarFestival.java index 75db701dd..0b5234793 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/date/chinese/LunarFestival.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/date/chinese/LunarFestival.java @@ -33,7 +33,7 @@ public class LunarFestival { static { // 节日 - L_FTV.put(MapUtil.entry(1, 1), "春节"); + L_FTV.put(MapUtil.entry(1, 1), "春节*"); L_FTV.put(MapUtil.entry(1, 2), "犬日"); L_FTV.put(MapUtil.entry(1, 3), "猪日"); L_FTV.put(MapUtil.entry(1, 4), "羊日"); @@ -50,7 +50,7 @@ public class LunarFestival { // 二月 L_FTV.put(MapUtil.entry(2, 1), "中和节 太阳生日"); - L_FTV.put(MapUtil.entry(2, 2), "龙抬头"); + L_FTV.put(MapUtil.entry(2, 2), "龙头节 龙抬头"); L_FTV.put(MapUtil.entry(2, 12), "花朝节"); L_FTV.put(MapUtil.entry(2, 19), "观世音圣诞"); @@ -63,7 +63,7 @@ public class LunarFestival { L_FTV.put(MapUtil.entry(4, 8), "佛诞节"); // 五月 - L_FTV.put(MapUtil.entry(5, 5), "端午节 端阳节"); + L_FTV.put(MapUtil.entry(5, 5), "端午节 端阳节*"); // 六月 L_FTV.put(MapUtil.entry(6, 6), "晒衣节 姑姑节"); @@ -71,14 +71,14 @@ public class LunarFestival { L_FTV.put(MapUtil.entry(6, 24), "彝族火把节"); // 七月 - L_FTV.put(MapUtil.entry(7, 7), "七夕"); + L_FTV.put(MapUtil.entry(7, 7), "七夕节"); L_FTV.put(MapUtil.entry(7, 14), "鬼节(南方)"); L_FTV.put(MapUtil.entry(7, 15), "中元节"); L_FTV.put(MapUtil.entry(7, 15), "盂兰盆节 中元节"); L_FTV.put(MapUtil.entry(7, 30), "地藏节"); // 八月 - L_FTV.put(MapUtil.entry(8, 15), "中秋节"); + L_FTV.put(MapUtil.entry(8, 15), "中秋节*"); // 九月 L_FTV.put(MapUtil.entry(9, 9), "重阳节"); diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/date/ChineseDateTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/date/ChineseDateTest.java index 29b1c203f..2cf0e84bf 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/date/ChineseDateTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/date/ChineseDateTest.java @@ -200,4 +200,24 @@ public class ChineseDateTest { Assertions.assertEquals(chineseDate2, chineseDate3); Assertions.assertNotEquals(chineseDate2, chineseDate4); } + @Test + public void getNormalizedDateTest(){ + final Date date = DateUtil.parse("2024-4-24"); + final Date date2 = DateUtil.parse("2024-4-30"); + + final ChineseDate chineseDate = new ChineseDate(date); + final ChineseDate chineseDate2 = new ChineseDate(date2); + + Assertions.assertEquals("公元2024年农历甲辰年三月十六", chineseDate.getNormalizedDate()); + Assertions.assertEquals("农历甲辰年三月十六", chineseDate.getNormalizedDate(ChineseDate.ChineseDateFormat.GSS)); + Assertions.assertEquals("农历龙年三月十六", chineseDate.getNormalizedDate(ChineseDate.ChineseDateFormat.XSS)); + Assertions.assertEquals("农历甲辰年三月戊午日", chineseDate.getNormalizedDate(ChineseDate.ChineseDateFormat.GSG)); + Assertions.assertEquals("公元2024年农历甲辰年三月十六", chineseDate.getNormalizedDate(ChineseDate.ChineseDateFormat.Mix)); + + Assertions.assertEquals("公元2024年农历甲辰年三月廿二", chineseDate2.getNormalizedDate()); + Assertions.assertEquals("农历甲辰年三月廿二", chineseDate2.getNormalizedDate(ChineseDate.ChineseDateFormat.GSS)); + Assertions.assertEquals("农历龙年三月廿二", chineseDate2.getNormalizedDate(ChineseDate.ChineseDateFormat.XSS)); + Assertions.assertEquals("农历甲辰年三月甲子日", chineseDate2.getNormalizedDate(ChineseDate.ChineseDateFormat.GSG)); + Assertions.assertEquals("公元2024年农历甲辰年三月廿二", chineseDate2.getNormalizedDate(ChineseDate.ChineseDateFormat.Mix)); + } }