diff --git a/README.md b/README.md index c79a4ae..2e29092 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ lunar是一款无第三方依赖的公历(阳历)、农历(阴历、老黄历) cn.6tail lunar - 1.2.14 + 1.2.15 ``` @@ -57,6 +57,8 @@ lunar是一款无第三方依赖的公历(阳历)、农历(阴历、老黄历) ## 更新日志 +v1.2.15 南京大XX纪念日更改为国家公祭日;新增初候、二候、三候;新增三元九运;新增道历戊日。 + v1.2.14 佛历新增27宿;修复宜忌重复的问题;修复获取气时缺冬至的问题。 v1.2.13 新增道历Tao。 diff --git a/README_EN.md b/README_EN.md index f1b1dee..5cfc94c 100644 --- a/README_EN.md +++ b/README_EN.md @@ -12,7 +12,7 @@ lunar is a calendar library for Solar and Chinese Lunar. cn.6tail lunar - 1.2.13 + 1.2.15 ``` diff --git a/pom.xml b/pom.xml index e888ffc..90caefa 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ cn.6tail lunar jar - 1.2.14 + 1.2.15 ${project.groupId}:${project.artifactId} https://github.com/6tail/lunar-java a calendar library for Solar and Chinese Lunar diff --git a/src/main/java/com/nlf/calendar/Lunar.java b/src/main/java/com/nlf/calendar/Lunar.java index 5e6aad4..0ebf06c 100644 --- a/src/main/java/com/nlf/calendar/Lunar.java +++ b/src/main/java/com/nlf/calendar/Lunar.java @@ -1954,12 +1954,22 @@ public class Lunar { * @return 节气 */ public JieQi getNextJie() { + return getNextJie(false); + } + + /** + * 获取下一节令(顺推的第一个节令) + * + * @param wholeDay 是否按天计 + * @return 节气 + */ + public JieQi getNextJie(boolean wholeDay) { int l = JIE_QI_IN_USE.length/2; String[] conditions = new String[l]; for(int i=0;i filters = new HashSet(); @@ -2037,7 +2098,7 @@ public class Lunar { Collections.addAll(filters, conditions); } boolean filter = !filters.isEmpty(); - String today = solar.toYmdHms(); + String today = wholeDay ? solar.toYmd() : solar.toYmdHms(); for (Map.Entry entry : jieQi.entrySet()) { String jq = convertJieQi(entry.getKey()); if (filter) { @@ -2046,22 +2107,34 @@ public class Lunar { } } Solar solar = entry.getValue(); - String day = solar.toYmdHms(); + String day = wholeDay ? solar.toYmd() : solar.toYmdHms(); if (forward) { if (day.compareTo(today) < 0) { continue; } - if (null == near || day.compareTo(near.toYmdHms()) < 0) { + if (null == near) { name = jq; near = solar; + } else { + String nearDay = wholeDay ? near.toYmd() : near.toYmdHms(); + if (day.compareTo(nearDay) < 0) { + name = jq; + near = solar; + } } } else { if (day.compareTo(today) > 0) { continue; } - if (null == near || day.compareTo(near.toYmdHms()) > 0) { + if (null == near) { name = jq; near = solar; + } else { + String nearDay = wholeDay ? near.toYmd() : near.toYmdHms(); + if (day.compareTo(nearDay) > 0) { + name = jq; + near = solar; + } } } } @@ -2626,7 +2699,7 @@ public class Lunar { */ @SuppressWarnings("MagicConstant") public String getWuHou() { - JieQi jieQi = getPrevJieQi(); + JieQi jieQi = getPrevJieQi(true); String name = jieQi.getName(); int offset = 0; for (int i = 0, j = JIE_QI.length; i < j; i++) { @@ -2644,6 +2717,21 @@ public class Lunar { return LunarUtil.WU_HOU[(offset * 3 + days / 5) % LunarUtil.WU_HOU.length]; } + /** + * 获取候 + * + * @return 候 + */ + public String getHou() { + JieQi jieQi = getPrevJieQi(true); + String name = jieQi.getName(); + Calendar currentCalendar = ExactDate.fromYmd(solar.getYear(), solar.getMonth(), solar.getDay()); + Solar startSolar = jieQi.getSolar(); + Calendar startCalendar = ExactDate.fromYmd(startSolar.getYear(), startSolar.getMonth(), startSolar.getDay()); + int days = (int) ((currentCalendar.getTimeInMillis() - startCalendar.getTimeInMillis()) / MS_PER_DAY); + return String.format("%s %s", name, LunarUtil.HOU[(days / 5) % LunarUtil.HOU.length]); + } + /** * 获取日禄 * @return 日禄 diff --git a/src/main/java/com/nlf/calendar/LunarYear.java b/src/main/java/com/nlf/calendar/LunarYear.java index a467bca..c4f590a 100644 --- a/src/main/java/com/nlf/calendar/LunarYear.java +++ b/src/main/java/com/nlf/calendar/LunarYear.java @@ -15,6 +15,16 @@ import java.util.Map; */ public class LunarYear { + /** + * 元 + */ + private static final String[] YUAN = {"下", "上", "中"}; + + /** + * 运 + */ + private static final String[] YUN = {"七", "八", "九", "一", "二", "三", "四", "五", "六"}; + /** * 闰冬月年份 */ @@ -264,6 +274,24 @@ public class LunarYear { return LunarUtil.NUMBER[offset+1] + "日得金"; } + /** + * 获取三元 + * + * @return 元 + */ + public String getYuan() { + return YUAN[((year + 2696) / 60) % 3] + "元"; + } + + /** + * 获取九运 + * + * @return 运 + */ + public String getYun() { + return YUN[((year + 2696) / 20) % 9] + "运"; + } + @Override public String toString() { return year + ""; diff --git a/src/main/java/com/nlf/calendar/Tao.java b/src/main/java/com/nlf/calendar/Tao.java index 22f0926..e042b78 100644 --- a/src/main/java/com/nlf/calendar/Tao.java +++ b/src/main/java/com/nlf/calendar/Tao.java @@ -149,6 +149,33 @@ public class Tao { return TaoUtil.BA_HUI.containsKey(lunar.getDayInGanZhi()); } + /** + * 是否明戊日 + * + * @return true/false + */ + public boolean isDayMingWu() { + return "戊".equals(lunar.getDayGan()); + } + + /** + * 是否暗戊日 + * + * @return true/false + */ + public boolean isDayAnWu() { + return lunar.getDayZhi().equals(TaoUtil.AN_WU[Math.abs(getMonth()) - 1]); + } + + /** + * 是否戊日 + * + * @return true/false + */ + public boolean isDayWu() { + return isDayMingWu() || isDayAnWu(); + } + @Override public String toString() { return String.format("%s年%s月%s", getYearInChinese(), getMonthInChinese(), getDayInChinese()); diff --git a/src/main/java/com/nlf/calendar/util/LunarUtil.java b/src/main/java/com/nlf/calendar/util/LunarUtil.java index eb6131a..a04f889 100644 --- a/src/main/java/com/nlf/calendar/util/LunarUtil.java +++ b/src/main/java/com/nlf/calendar/util/LunarUtil.java @@ -17,6 +17,8 @@ public class LunarUtil{ public static final String[] XUN_KONG = {"戌亥","申酉","午未","辰巳","寅卯","子丑"}; /** 六曜 */ public static final String[] LIU_YAO = {"先胜","友引","先负","佛灭","大安","赤口"}; + /** 候 */ + public static final String[] HOU = {"初候", "二候", "三候"}; /** 物候 */ public static final String[] WU_HOU = {"蚯蚓结","麋角解","水泉动","雁北乡","鹊始巢","雉始雊","鸡始乳","征鸟厉疾","水泽腹坚","东风解冻","蛰虫始振","鱼陟负冰","獭祭鱼","候雁北","草木萌动","桃始华","仓庚鸣","鹰化为鸠","玄鸟至","雷乃发声","始电","桐始华","田鼠化为鴽","虹始见","萍始生","鸣鸠拂奇羽","戴胜降于桑","蝼蝈鸣","蚯蚓出","王瓜生","苦菜秀","靡草死","麦秋至","螳螂生","鵙始鸣","反舌无声","鹿角解","蜩始鸣","半夏生","温风至","蟋蟀居壁","鹰始挚","腐草为萤","土润溽暑","大雨行时","凉风至","白露降","寒蝉鸣","鹰乃祭鸟","天地始肃","禾乃登","鸿雁来","玄鸟归","群鸟养羞","雷始收声","蛰虫坯户","水始涸","鸿雁来宾","雀入大水为蛤","菊有黄花","豺乃祭兽","草木黄落","蛰虫咸俯","水始冰","地始冻","雉入大水为蜃","虹藏不见","天气上升地气下降","闭塞而成冬","鹖鴠不鸣","虎始交","荔挺出"}; /** 天干 */ diff --git a/src/main/java/com/nlf/calendar/util/SolarUtil.java b/src/main/java/com/nlf/calendar/util/SolarUtil.java index 5c712e8..6d360ef 100644 --- a/src/main/java/com/nlf/calendar/util/SolarUtil.java +++ b/src/main/java/com/nlf/calendar/util/SolarUtil.java @@ -128,7 +128,7 @@ public class SolarUtil { put("11-28", Collections.nCopies(1, "恩格斯诞辰纪念日")); put("12-1", Collections.nCopies(1, "世界艾滋病日")); put("12-12", Collections.nCopies(1, "西安事变纪念日")); - put("12-13", Collections.nCopies(1, "南京大屠杀纪念日")); + put("12-13", Collections.nCopies(1, "国家公祭日")); put("12-26", Collections.nCopies(1, "毛泽东诞辰纪念日")); } }; diff --git a/src/main/java/com/nlf/calendar/util/TaoUtil.java b/src/main/java/com/nlf/calendar/util/TaoUtil.java index 4ec7337..63537c7 100644 --- a/src/main/java/com/nlf/calendar/util/TaoUtil.java +++ b/src/main/java/com/nlf/calendar/util/TaoUtil.java @@ -169,4 +169,9 @@ public class TaoUtil { */ public static final String[] WU_LA = {"1-1", "5-5", "7-7", "10-1", "12-8"}; + /** + * 暗戊 + */ + public static final String[] AN_WU = {"未", "戌", "辰", "寅", "午", "子", "酉", "申", "巳", "亥", "卯", "丑"}; + } diff --git a/src/test/java/test/WuHouTest.java b/src/test/java/test/WuHouTest.java index 650ec6c..4f86508 100644 --- a/src/test/java/test/WuHouTest.java +++ b/src/test/java/test/WuHouTest.java @@ -75,4 +75,32 @@ public class WuHouTest { Assert.assertEquals(solar.toString(),"蚯蚓结",lunar.getWuHou()); } + @Test + public void test10(){ + Solar solar = new Solar(2021,12,21); + Lunar lunar = solar.getLunar(); + Assert.assertEquals(solar.toString(),"冬至 初候",lunar.getHou()); + } + + @Test + public void test11(){ + Solar solar = new Solar(2021,12,26); + Lunar lunar = solar.getLunar(); + Assert.assertEquals(solar.toString(),"冬至 二候",lunar.getHou()); + } + + @Test + public void test12(){ + Solar solar = new Solar(2021,12,31); + Lunar lunar = solar.getLunar(); + Assert.assertEquals(solar.toString(),"冬至 三候",lunar.getHou()); + } + + @Test + public void test13(){ + Solar solar = new Solar(2022,1,5); + Lunar lunar = solar.getLunar(); + Assert.assertEquals(solar.toString(),"小寒 初候",lunar.getHou()); + } + } diff --git a/src/test/java/test/YearTest.java b/src/test/java/test/YearTest.java index 34ab75a..3341af5 100644 --- a/src/test/java/test/YearTest.java +++ b/src/test/java/test/YearTest.java @@ -61,4 +61,82 @@ public class YearTest { Assert.assertEquals("三日得金",year.getDeJin()); } + @Test + public void test5(){ + LunarYear year = new LunarYear(1864); + Assert.assertEquals("上元",year.getYuan()); + } + + @Test + public void test6(){ + LunarYear year = new LunarYear(1923); + Assert.assertEquals("上元",year.getYuan()); + } + + @Test + public void test7(){ + LunarYear year = new LunarYear(1924); + Assert.assertEquals("中元",year.getYuan()); + } + + @Test + public void test8(){ + LunarYear year = new LunarYear(1983); + Assert.assertEquals("中元",year.getYuan()); + } + + @Test + public void test9(){ + LunarYear year = new LunarYear(1984); + Assert.assertEquals("下元",year.getYuan()); + } + + @Test + public void test10(){ + LunarYear year = new LunarYear(2043); + Assert.assertEquals("下元",year.getYuan()); + } + + @Test + public void test11(){ + LunarYear year = new LunarYear(1864); + Assert.assertEquals("一运",year.getYun()); + } + + @Test + public void test12(){ + LunarYear year = new LunarYear(1883); + Assert.assertEquals("一运",year.getYun()); + } + + @Test + public void test13(){ + LunarYear year = new LunarYear(1884); + Assert.assertEquals("二运",year.getYun()); + } + + @Test + public void test14(){ + LunarYear year = new LunarYear(1903); + Assert.assertEquals("二运",year.getYun()); + } + + @Test + public void test15(){ + LunarYear year = new LunarYear(1904); + Assert.assertEquals("三运",year.getYun()); + } + + @Test + public void test16(){ + LunarYear year = new LunarYear(1923); + Assert.assertEquals("三运",year.getYun()); + } + + @Test + public void test17(){ + LunarYear year = new LunarYear(2004); + Assert.assertEquals("八运",year.getYun()); + } + }