From e29ab4961870b9a51f966c308965d5dc99fac412 Mon Sep 17 00:00:00 2001 From: 6tail <6tail@6tail.cn> Date: Thu, 15 Oct 2020 19:14:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=AB=8B=E6=98=A5=E8=87=B3?= =?UTF-8?q?=E6=AD=A3=E6=9C=88=E5=88=9D=E4=B8=80=E4=B9=8B=E9=97=B4=E5=85=AB?= =?UTF-8?q?=E5=AD=97=E5=B9=B4=E6=9C=88=E6=9F=B1=E9=94=99=E8=AF=AF=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=9B=E6=96=B0=E5=A2=9E=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=86=9C=E5=8E=86=E6=97=A5=E6=9C=9F=E7=9A=84=E6=8E=A8=E7=A7=BB?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- src/main/java/com/nlf/calendar/Lunar.java | 105 +++++++++++++++--- .../java/com/nlf/calendar/util/LunarUtil.java | 10 +- src/test/java/test/BaZiTest.java | 27 +++++ src/test/java/test/LunarTest.java | 10 ++ 5 files changed, 131 insertions(+), 23 deletions(-) diff --git a/pom.xml b/pom.xml index a6c1761..7bc18b9 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ junit junit - 4.12 + 4.13.1 test diff --git a/src/main/java/com/nlf/calendar/Lunar.java b/src/main/java/com/nlf/calendar/Lunar.java index 177808d..4678847 100644 --- a/src/main/java/com/nlf/calendar/Lunar.java +++ b/src/main/java/com/nlf/calendar/Lunar.java @@ -414,6 +414,7 @@ public class Lunar{ * 计算干支纪年 */ private void computeYear(){ + //以正月初一开始 yearGanIndex = (year+LunarUtil.BASE_YEAR_GANZHI_INDEX)%10; yearZhiIndex = (year+LunarUtil.BASE_YEAR_GANZHI_INDEX)%12; @@ -425,32 +426,57 @@ public class Lunar{ int gExact = yearGanIndex; int zExact = yearZhiIndex; + //获取立春的阳历时刻 + Solar liChun = jieQi.get("立春"); + + //阳历和阴历年份相同代表正月初一及以后 if(year==solar.getYear()){ - //获取立春的阳历时刻 - Solar liChun = jieQi.get("立春"); //立春日期判断 if(solar.toYmd().compareTo(liChun.toYmd())<0) { g--; - if(g<0){ - g += 10; - } z--; - if(z<0){ - z += 12; - } } //立春交接时刻判断 if(solar.toYmdHms().compareTo(liChun.toYmdHms())<0) { gExact--; - if(gExact<0){ - gExact += 10; - } zExact--; - if(zExact<0){ - zExact += 12; - } + } + }else{ + if(solar.toYmd().compareTo(liChun.toYmd())>=0) { + g++; + z++; + } + if(solar.toYmdHms().compareTo(liChun.toYmdHms())>=0) { + gExact++; + zExact++; } } + + if(g<0){ + g += 10; + } + if(g>=10){ + g-=10; + } + if(z<0){ + z += 12; + } + if(z>=12){ + z-=12; + } + if(gExact<0){ + gExact += 10; + } + if(gExact>=10){ + gExact-=10; + } + if(zExact<0){ + zExact += 12; + } + if(zExact>=12){ + zExact-=12; + } + yearGanIndexByLiChun = g; yearZhiIndexByLiChun = z; @@ -2271,4 +2297,55 @@ public class Lunar{ } return eightChar; } + + /** + * 获取往后推几天的农历日期,如果要往前推,则天数用负数 + * @param days 天数 + * @return 农历日期 + */ + public Lunar next(int days){ + int y = year; + int m = month; + int d = day; + if(days>0){ + int daysInMonth = LunarUtil.getDaysOfMonth(y,m); + int rest = day+days; + while(daysInMonth < rest) { + if(m>0){ + if(LunarUtil.getLeapMonth(y)!=m){ + m++; + }else{ + m = -m; + } + }else{ + m = 1-m; + } + if(13==m){ + y++; + m=1; + } + rest -= daysInMonth; + daysInMonth = LunarUtil.getDaysOfMonth(y,m); + } + d = rest; + }else if(days<0){ + int daysInMonth = day; + int rest = -days; + while(daysInMonth <= rest) { + if(m>0){ + m--; + if(0==m){ + y--; + m = LunarUtil.getLeapMonth(y)!=12?12:-12; + } + }else{ + m = -m; + } + rest -= daysInMonth; + daysInMonth = LunarUtil.getDaysOfMonth(y,m); + } + d = daysInMonth - rest; + } + return new Lunar(y,m,d,hour,minute,second); + } } diff --git a/src/main/java/com/nlf/calendar/util/LunarUtil.java b/src/main/java/com/nlf/calendar/util/LunarUtil.java index 76bdecc..6626559 100644 --- a/src/main/java/com/nlf/calendar/util/LunarUtil.java +++ b/src/main/java/com/nlf/calendar/util/LunarUtil.java @@ -1142,17 +1142,11 @@ public class LunarUtil{ public static int nextMonth(int y,int m){ int n = Math.abs(m)+1; if(m>0){ - int index = y-BASE_YEAR+BASE_INDEX; - int v = LUNAR_MONTH[2*index+1]; - v = (v>>4)&0x0F; - if(v==m){ + if(m==getLeapMonth(y)){ n = -m; } } - if(n==13){ - n = 1; - } - return n; + return 13!=n?n:1; } /** diff --git a/src/test/java/test/BaZiTest.java b/src/test/java/test/BaZiTest.java index 7177246..68ec6fc 100644 --- a/src/test/java/test/BaZiTest.java +++ b/src/test/java/test/BaZiTest.java @@ -22,6 +22,33 @@ public class BaZiTest { Assert.assertEquals("时柱", "壬辰", eightChar.getTime()); } + @Test + public void testGanZhi2() { + Solar solar = new Solar(1988, 2, 15, 23, 30, 0); + Lunar lunar = solar.getLunar(); + EightChar eightChar = lunar.getEightChar(); + Assert.assertEquals("年柱", "戊辰", eightChar.getYear()); + Assert.assertEquals("月柱", "甲寅", eightChar.getMonth()); + Assert.assertEquals("日柱", "辛丑", eightChar.getDay()); + Assert.assertEquals("时柱", "戊子", eightChar.getTime()); + + solar = new Solar(1988, 2, 15, 22, 30, 0); + lunar = solar.getLunar(); + eightChar = lunar.getEightChar(); + Assert.assertEquals("年柱", "戊辰", eightChar.getYear()); + Assert.assertEquals("月柱", "甲寅", eightChar.getMonth()); + Assert.assertEquals("日柱", "庚子", eightChar.getDay()); + Assert.assertEquals("时柱", "丁亥", eightChar.getTime()); + + solar = new Solar(1988, 2, 2, 22, 30, 0); + lunar = solar.getLunar(); + eightChar = lunar.getEightChar(); + Assert.assertEquals("年柱", "丁卯", eightChar.getYear()); + Assert.assertEquals("月柱", "癸丑", eightChar.getMonth()); + Assert.assertEquals("日柱", "丁亥", eightChar.getDay()); + Assert.assertEquals("时柱", "辛亥", eightChar.getTime()); + } + @Test public void testHideGan() { Solar solar = new Solar(2005, 12, 23, 8, 37, 0); diff --git a/src/test/java/test/LunarTest.java b/src/test/java/test/LunarTest.java index 9d9ea18..7bc8048 100644 --- a/src/test/java/test/LunarTest.java +++ b/src/test/java/test/LunarTest.java @@ -1,6 +1,7 @@ package test; import com.nlf.calendar.Lunar; +import com.nlf.calendar.Solar; import org.junit.Assert; import org.junit.Test; @@ -20,4 +21,13 @@ public class LunarTest { Assert.assertEquals("2019-05-01 00:00:00 星期三 (劳动节) 金牛座",date.getSolar().toFullString()); } + @Test + public void testNext(){ + Solar solar = new Solar(2020,1,10,12,0,0); + Lunar lunar = solar.getLunar(); + for(int i=-500;i<500;i++){ + Assert.assertEquals("推移天数:"+i,solar.next(i).getLunar().toFullString(),lunar.next(i).toFullString()); + } + } + }