diff --git a/src/main/java/com/nlf/calendar/Lunar.java b/src/main/java/com/nlf/calendar/Lunar.java index c860f77..75b3be9 100644 --- a/src/main/java/com/nlf/calendar/Lunar.java +++ b/src/main/java/com/nlf/calendar/Lunar.java @@ -60,6 +60,10 @@ public class Lunar{ private int dayGanIndex; /** 日对应的地支下标,0-11 */ private int dayZhiIndex; + /** 日对应的天干下标(最精确的,供八字用,晚子时算第二天),0-9 */ + private int dayGanIndexExact; + /** 日对应的地支下标(最精确的,供八字用,晚子时算第二天),0-11 */ + private int dayZhiIndexExact; /** 月对应的天干下标(以节交接当天起算),0-9 */ private int monthGanIndex; /** 月对应的地支下标(以节交接当天起算),0-11 */ @@ -326,6 +330,25 @@ public class Lunar{ int addDays = (dayOffset + LunarUtil.BASE_DAY_GANZHI_INDEX)%60; dayGanIndex = addDays%10; dayZhiIndex = addDays%12; + + int dayGanExact = dayGanIndex; + int dayZhiExact = dayZhiIndex; + + // 晚子时(夜子/子夜)应算作第二天 + String hm = (hour<10?"0":"")+hour+":"+(minute<10?"0":"")+minute; + if(hm.compareTo("23:00")>=0&&hm.compareTo("23:59")<=0){ + dayGanExact++; + if(dayGanExact>=10){ + dayGanExact -= 10; + } + dayZhiExact++; + if(dayZhiExact>=12){ + dayZhiExact -= 12; + } + } + + dayGanIndexExact = dayGanExact; + dayZhiIndexExact = dayZhiExact; } /** @@ -334,15 +357,7 @@ public class Lunar{ private void computeTime(){ String hm = (hour<10?"0":"")+hour+":"+(minute<10?"0":"")+minute; timeZhiIndex = LunarUtil.getTimeZhiIndex(hm); - int dayGan = dayGanIndex; - // 晚子时(夜子/子夜)应算作第二天 - if(hm.compareTo("23:00")>=0&&hm.compareTo("23:59")<=0){ - dayGan++; - if(dayGan>=10){ - dayGan -= 10; - } - } - timeGanIndex = (dayGan%5*2+timeZhiIndex)%10; + timeGanIndex = (dayGanIndexExact%5*2+timeZhiIndex)%10; } /** @@ -559,6 +574,15 @@ public class Lunar{ return getDayGan()+getDayZhi(); } + /** + * 获取干支纪日(日柱,晚子时算第二天) + * + * @return 干支纪日(日柱),如己卯 + */ + public String getDayInGanZhiExact(){ + return getDayGanExact()+getDayZhiExact(); + } + /** * 获取日天干 * @@ -568,6 +592,15 @@ public class Lunar{ return LunarUtil.GAN[dayGanIndex+1]; } + /** + * 获取日天干(晚子时算第二天) + * + * @return 日天干,如甲 + */ + public String getDayGanExact(){ + return LunarUtil.GAN[dayGanIndexExact+1]; + } + /** * 获取日地支 * @@ -577,6 +610,15 @@ public class Lunar{ return LunarUtil.ZHI[dayZhiIndex+1]; } + /** + * 获取日地支(晚子时算第二天) + * + * @return 日地支,如卯 + */ + public String getDayZhiExact(){ + return LunarUtil.ZHI[dayZhiIndexExact+1]; + } + /** * 获取年生肖 * @@ -1170,11 +1212,10 @@ public class Lunar{ */ public List getBaZi(){ List l = new ArrayList(4); - String timeGan = LunarUtil.GAN[(dayGanIndex%5*12+timeZhiIndex)%10+1]; l.add(getYearInGanZhiExact()); l.add(getMonthInGanZhiExact()); - l.add(getDayInGanZhi()); - l.add(timeGan+getTimeZhi()); + l.add(getDayInGanZhiExact()); + l.add(getTimeInGanZhi()); return l; } diff --git a/src/test/java/sample/BaZiTest.java b/src/test/java/sample/BaZiTest.java index 3821c46..61bb0ed 100644 --- a/src/test/java/sample/BaZiTest.java +++ b/src/test/java/sample/BaZiTest.java @@ -58,4 +58,12 @@ public class BaZiTest { System.out.println(lunar.getBaZi()); } + @Test + public void test7(){ + Solar solar = new Solar(2020,5,26,23,43,0); + Lunar lunar = solar.getLunar(); + //[庚子, 辛巳, 庚午, 丙子] + System.out.println(lunar.getBaZi()); + } + }