diff --git a/src/main/java/com/nlf/calendar/Fu.java b/src/main/java/com/nlf/calendar/Fu.java new file mode 100644 index 0000000..e925f82 --- /dev/null +++ b/src/main/java/com/nlf/calendar/Fu.java @@ -0,0 +1,53 @@ +package com.nlf.calendar; + +/** + * 三伏 + *
从夏至后第3个庚日算起,初伏为10天,中伏为10天或20天,末伏为10天。当夏至与立秋之间出现4个庚日时中伏为10天,出现5个庚日则为20天。
+ * + * @author 6tail + */ +public class Fu { + /** + * 名称:初伏、中伏、末伏 + */ + private String name; + + /** + * 当前入伏第几天,1-20 + */ + private int index; + + + public Fu() { + } + + public Fu(String name, int index) { + this.name = name; + this.index = index; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + @Override + public String toString() { + return name; + } + + public String toFullString() { + return name + "第" + index + "天"; + } +} diff --git a/src/main/java/com/nlf/calendar/Lunar.java b/src/main/java/com/nlf/calendar/Lunar.java index 9a4cc86..5101857 100644 --- a/src/main/java/com/nlf/calendar/Lunar.java +++ b/src/main/java/com/nlf/calendar/Lunar.java @@ -2339,6 +2339,38 @@ public class Lunar{ return timeZhiIndex; } + public int getDayGanIndex() { + return dayGanIndex; + } + + public int getDayZhiIndex() { + return dayZhiIndex; + } + + public int getMonthGanIndex() { + return monthGanIndex; + } + + public int getMonthZhiIndex() { + return monthZhiIndex; + } + + public int getYearGanIndex() { + return yearGanIndex; + } + + public int getYearZhiIndex() { + return yearZhiIndex; + } + + public int getYearGanIndexByLiChun() { + return yearGanIndexByLiChun; + } + + public int getYearZhiIndexByLiChun() { + return yearZhiIndexByLiChun; + } + public int getDayGanIndexExact() { return dayGanIndexExact; } @@ -2576,4 +2608,104 @@ public class Lunar{ public String getTimeXunKong(){ return LunarUtil.getXunKong(getTimeInGanZhi()); } + + /** + * 获取数九 + * @return 数九,如果不是数九天,返回null + */ + public ShuJiu getShuJiu(){ + Calendar currentCalendar = Calendar.getInstance(); + currentCalendar.set(solar.getYear(),solar.getMonth()-1,solar.getDay(),0,0,0); + currentCalendar.set(Calendar.MILLISECOND,0); + Solar start = jieQi.get(JIE_QI_APPEND); + Calendar startCalendar = Calendar.getInstance(); + startCalendar.set(start.getYear(),start.getMonth()-1,start.getDay(),0,0,0); + startCalendar.set(Calendar.MILLISECOND,0); + + if(currentCalendar.compareTo(startCalendar)<0){ + start = jieQi.get(JIE_QI_FIRST); + startCalendar.set(start.getYear(),start.getMonth()-1,start.getDay(),0,0,0); + } + + Calendar endCalendar = Calendar.getInstance(); + endCalendar.set(start.getYear(),start.getMonth()-1,start.getDay(),0,0,0); + endCalendar.add(Calendar.DATE,81); + endCalendar.set(Calendar.MILLISECOND,0); + + if(currentCalendar.compareTo(startCalendar)<0||currentCalendar.compareTo(endCalendar)>=0){ + return null; + } + + int days = (int)((currentCalendar.getTimeInMillis()-startCalendar.getTimeInMillis())/(1000*60*60*24)); + return new ShuJiu(LunarUtil.NUMBER[days/9+1]+"九",days%9+1); + } + + /** + * 获取三伏 + * @return 三伏,如果不是伏天,返回null + */ + public Fu getFu(){ + Calendar currentCalendar = Calendar.getInstance(); + currentCalendar.set(solar.getYear(),solar.getMonth()-1,solar.getDay(),0,0,0); + currentCalendar.set(Calendar.MILLISECOND,0); + Solar xiaZhi = jieQi.get("夏至"); + Solar liQiu = jieQi.get("立秋"); + Calendar startCalendar = Calendar.getInstance(); + startCalendar.set(xiaZhi.getYear(),xiaZhi.getMonth()-1,xiaZhi.getDay(),0,0,0); + startCalendar.set(Calendar.MILLISECOND,0); + + // 第1个庚日 + int add = 6-xiaZhi.getLunar().getDayGanIndex(); + if(add<0){ + add += 10; + } + // 第3个庚日,即初伏第1天 + add += 20; + startCalendar.add(Calendar.DATE,add); + + // 初伏以前 + if(currentCalendar.compareTo(startCalendar)<0){ + return null; + } + + int days = (int)((currentCalendar.getTimeInMillis()-startCalendar.getTimeInMillis())/(1000*60*60*24)); + if(days<10){ + return new Fu("初伏",days+1); + } + + // 第4个庚日,中伏第1天 + startCalendar.add(Calendar.DATE,10); + + days = (int)((currentCalendar.getTimeInMillis()-startCalendar.getTimeInMillis())/(1000*60*60*24)); + if(days<10){ + return new Fu("中伏",days+1); + } + + // 第5个庚日,中伏第11天或末伏第1天 + startCalendar.add(Calendar.DATE,10); + + Calendar liQiuCalendar = Calendar.getInstance(); + liQiuCalendar.set(liQiu.getYear(),liQiu.getMonth()-1,liQiu.getDay(),0,0,0); + liQiuCalendar.set(Calendar.MILLISECOND,0); + + days = (int)((currentCalendar.getTimeInMillis()-startCalendar.getTimeInMillis())/(1000*60*60*24)); + // 末伏 + if(liQiuCalendar.compareTo(startCalendar)<=0){ + if(days<10){ + return new Fu("末伏",days+1); + } + }else{ + // 中伏 + if(days<10){ + return new Fu("中伏",days+11); + } + // 末伏第1天 + startCalendar.add(Calendar.DATE,10); + days = (int)((currentCalendar.getTimeInMillis()-startCalendar.getTimeInMillis())/(1000*60*60*24)); + if(days<10){ + return new Fu("末伏",days+1); + } + } + return null; + } } diff --git a/src/main/java/com/nlf/calendar/ShuJiu.java b/src/main/java/com/nlf/calendar/ShuJiu.java new file mode 100644 index 0000000..0196692 --- /dev/null +++ b/src/main/java/com/nlf/calendar/ShuJiu.java @@ -0,0 +1,51 @@ +package com.nlf.calendar; + +/** + * 数九 + * @author 6tail + */ +public class ShuJiu { + + /** + * 名称,如一九、二九 + */ + private String name; + + /** + * 当前数九第几天,1-9 + */ + private int index; + + public ShuJiu() { + } + + public ShuJiu(String name, int index) { + this.name = name; + this.index = index; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + @Override + public String toString() { + return name; + } + + public String toFullString() { + return name + "第" + index + "天"; + } +} diff --git a/src/main/java/com/nlf/calendar/Solar.java b/src/main/java/com/nlf/calendar/Solar.java index 9af2161..68405c6 100644 --- a/src/main/java/com/nlf/calendar/Solar.java +++ b/src/main/java/com/nlf/calendar/Solar.java @@ -379,25 +379,25 @@ public class Solar{ * @return 星座 */ public String getXingZuo(){ - int index = 11,m = month,d = day; - int y = m*100+d; + int index = 11; + int y = month*100+day; if(y>=321&&y<=419){ index = 0; }else if(y>=420&&y<=520){ index = 1; - }else if(y>=521&&y<=620){ + }else if(y>=521&&y<=621){ index = 2; - }else if(y>=621&&y<=722){ + }else if(y>=622&&y<=722){ index = 3; }else if(y>=723&&y<=822){ index = 4; }else if(y>=823&&y<=922){ index = 5; - }else if(y>=923&&y<=1022){ + }else if(y>=923&&y<=1023){ index = 6; - }else if(y>=1023&&y<=1121){ + }else if(y>=1024&&y<=1122){ index = 7; - }else if(y>=1122&&y<=1221){ + }else if(y>=1123&&y<=1221){ index = 8; }else if(y>=1222||y<=119){ index = 9; diff --git a/src/test/java/test/FuTest.java b/src/test/java/test/FuTest.java new file mode 100644 index 0000000..f6ac9bf --- /dev/null +++ b/src/test/java/test/FuTest.java @@ -0,0 +1,140 @@ +package test; + +import com.nlf.calendar.Fu; +import com.nlf.calendar.Lunar; +import com.nlf.calendar.Solar; +import org.junit.Assert; +import org.junit.Test; + +/** + * 三伏测试 + * + * @author 6tail + */ +public class FuTest { + + @Test + public void test1(){ + Solar solar = new Solar(2011,7,14); + Lunar lunar = solar.getLunar(); + Fu fu = lunar.getFu(); + Assert.assertEquals(solar.toYmd(),"初伏",fu.toString()); + Assert.assertEquals(solar.toYmd(),"初伏第1天",fu.toFullString()); + } + + @Test + public void test2(){ + Solar solar = new Solar(2011,7,23); + Lunar lunar = solar.getLunar(); + Fu fu = lunar.getFu(); + Assert.assertEquals(solar.toYmd(),"初伏",fu.toString()); + Assert.assertEquals(solar.toYmd(),"初伏第10天",fu.toFullString()); + } + + @Test + public void test3(){ + Solar solar = new Solar(2011,7,24); + Lunar lunar = solar.getLunar(); + Fu fu = lunar.getFu(); + Assert.assertEquals(solar.toYmd(),"中伏",fu.toString()); + Assert.assertEquals(solar.toYmd(),"中伏第1天",fu.toFullString()); + } + + @Test + public void test4(){ + Solar solar = new Solar(2011,8,12); + Lunar lunar = solar.getLunar(); + Fu fu = lunar.getFu(); + Assert.assertEquals(solar.toYmd(),"中伏",fu.toString()); + Assert.assertEquals(solar.toYmd(),"中伏第20天",fu.toFullString()); + } + + @Test + public void test5(){ + Solar solar = new Solar(2011,8,13); + Lunar lunar = solar.getLunar(); + Fu fu = lunar.getFu(); + Assert.assertEquals(solar.toYmd(),"末伏",fu.toString()); + Assert.assertEquals(solar.toYmd(),"末伏第1天",fu.toFullString()); + } + + @Test + public void test6(){ + Solar solar = new Solar(2011,8,22); + Lunar lunar = solar.getLunar(); + Fu fu = lunar.getFu(); + Assert.assertEquals(solar.toYmd(),"末伏",fu.toString()); + Assert.assertEquals(solar.toYmd(),"末伏第10天",fu.toFullString()); + } + + @Test + public void test7(){ + Solar solar = new Solar(2011,7,13); + Lunar lunar = solar.getLunar(); + Fu fu = lunar.getFu(); + Assert.assertNull(solar.toYmd(),fu); + } + + @Test + public void test8(){ + Solar solar = new Solar(2011,8,23); + Lunar lunar = solar.getLunar(); + Fu fu = lunar.getFu(); + Assert.assertNull(solar.toYmd(),fu); + } + + @Test + public void test9(){ + Solar solar = new Solar(2012,7,18); + Lunar lunar = solar.getLunar(); + Fu fu = lunar.getFu(); + Assert.assertEquals(solar.toYmd(),"初伏",fu.toString()); + Assert.assertEquals(solar.toYmd(),"初伏第1天",fu.toFullString()); + } + + @Test + public void test10(){ + Solar solar = new Solar(2012,8,5); + Lunar lunar = solar.getLunar(); + Fu fu = lunar.getFu(); + Assert.assertEquals(solar.toYmd(),"中伏",fu.toString()); + Assert.assertEquals(solar.toYmd(),"中伏第9天",fu.toFullString()); + } + + @Test + public void test11(){ + Solar solar = new Solar(2012,8,8); + Lunar lunar = solar.getLunar(); + Fu fu = lunar.getFu(); + Assert.assertEquals(solar.toYmd(),"末伏",fu.toString()); + Assert.assertEquals(solar.toYmd(),"末伏第2天",fu.toFullString()); + } + + @Test + public void test12(){ + Solar solar = new Solar(2020,7,17); + Lunar lunar = solar.getLunar(); + Fu fu = lunar.getFu(); + Assert.assertEquals(solar.toYmd(),"初伏",fu.toString()); + Assert.assertEquals(solar.toYmd(),"初伏第2天",fu.toFullString()); + } + + @Test + public void test13(){ + Solar solar = new Solar(2020,7,26); + Lunar lunar = solar.getLunar(); + Fu fu = lunar.getFu(); + Assert.assertEquals(solar.toYmd(),"中伏",fu.toString()); + Assert.assertEquals(solar.toYmd(),"中伏第1天",fu.toFullString()); + } + + @Test + public void test14(){ + Solar solar = new Solar(2020,8,24); + Lunar lunar = solar.getLunar(); + Fu fu = lunar.getFu(); + Assert.assertEquals(solar.toYmd(),"末伏",fu.toString()); + Assert.assertEquals(solar.toYmd(),"末伏第10天",fu.toFullString()); + } + +} diff --git a/src/test/java/test/ShuJiuTest.java b/src/test/java/test/ShuJiuTest.java new file mode 100644 index 0000000..69577cd --- /dev/null +++ b/src/test/java/test/ShuJiuTest.java @@ -0,0 +1,78 @@ +package test; + +import com.nlf.calendar.Lunar; +import com.nlf.calendar.ShuJiu; +import com.nlf.calendar.Solar; +import org.junit.Assert; +import org.junit.Test; + +/** + * 数九测试 + * + * @author 6tail + */ +public class ShuJiuTest { + + @Test + public void test1(){ + Solar solar = new Solar(2020,12,21); + Lunar lunar = solar.getLunar(); + ShuJiu shuJiu = lunar.getShuJiu(); + Assert.assertEquals(solar.toYmd(),"一九",shuJiu.toString()); + Assert.assertEquals(solar.toYmd(),"一九第1天",shuJiu.toFullString()); + } + + @Test + public void test2(){ + Solar solar = new Solar(2020,12,22); + Lunar lunar = solar.getLunar(); + ShuJiu shuJiu = lunar.getShuJiu(); + Assert.assertEquals(solar.toYmd(),"一九",shuJiu.toString()); + Assert.assertEquals(solar.toYmd(),"一九第2天",shuJiu.toFullString()); + } + + @Test + public void test3(){ + Solar solar = new Solar(2020,1,7); + Lunar lunar = solar.getLunar(); + ShuJiu shuJiu = lunar.getShuJiu(); + Assert.assertEquals(solar.toYmd(),"二九",shuJiu.toString()); + Assert.assertEquals(solar.toYmd(),"二九第8天",shuJiu.toFullString()); + } + + @Test + public void test4(){ + Solar solar = new Solar(2021,1,6); + Lunar lunar = solar.getLunar(); + ShuJiu shuJiu = lunar.getShuJiu(); + Assert.assertEquals(solar.toYmd(),"二九",shuJiu.toString()); + Assert.assertEquals(solar.toYmd(),"二九第8天",shuJiu.toFullString()); + } + + @Test + public void test5(){ + Solar solar = new Solar(2021,1,8); + Lunar lunar = solar.getLunar(); + ShuJiu shuJiu = lunar.getShuJiu(); + Assert.assertEquals(solar.toYmd(),"三九",shuJiu.toString()); + Assert.assertEquals(solar.toYmd(),"三九第1天",shuJiu.toFullString()); + } + + @Test + public void test6(){ + Solar solar = new Solar(2021,3,5); + Lunar lunar = solar.getLunar(); + ShuJiu shuJiu = lunar.getShuJiu(); + Assert.assertEquals(solar.toYmd(),"九九",shuJiu.toString()); + Assert.assertEquals(solar.toYmd(),"九九第3天",shuJiu.toFullString()); + } + + @Test + public void test7(){ + Solar solar = new Solar(2021,7,5); + Lunar lunar = solar.getLunar(); + ShuJiu shuJiu = lunar.getShuJiu(); + Assert.assertNull(solar.toYmd(),shuJiu); + } + +} diff --git a/src/test/java/test/XingZuoTest.java b/src/test/java/test/XingZuoTest.java new file mode 100644 index 0000000..9d616b8 --- /dev/null +++ b/src/test/java/test/XingZuoTest.java @@ -0,0 +1,110 @@ +package test; + +import com.nlf.calendar.Solar; +import org.junit.Assert; +import org.junit.Test; + +/** + * 阳历测试 + * + * @author 6tail + */ +public class XingZuoTest { + + @Test + public void test1(){ + Solar solar = new Solar(2020,3,21); + Assert.assertEquals(solar.toYmd(),"白羊",solar.getXingZuo()); + solar = new Solar(2020,4,19); + Assert.assertEquals(solar.toYmd(),"白羊",solar.getXingZuo()); + } + + @Test + public void test2(){ + Solar solar = new Solar(2020,4,20); + Assert.assertEquals(solar.toYmd(),"金牛",solar.getXingZuo()); + solar = new Solar(2020,5,20); + Assert.assertEquals(solar.toYmd(),"金牛",solar.getXingZuo()); + } + + @Test + public void test3(){ + Solar solar = new Solar(2020,5,21); + Assert.assertEquals(solar.toYmd(),"双子",solar.getXingZuo()); + solar = new Solar(2020,6,21); + Assert.assertEquals(solar.toYmd(),"双子",solar.getXingZuo()); + } + + @Test + public void test4(){ + Solar solar = new Solar(2020,6,22); + Assert.assertEquals(solar.toYmd(),"巨蟹",solar.getXingZuo()); + solar = new Solar(2020,7,22); + Assert.assertEquals(solar.toYmd(),"巨蟹",solar.getXingZuo()); + } + + @Test + public void test5(){ + Solar solar = new Solar(2020,7,23); + Assert.assertEquals(solar.toYmd(),"狮子",solar.getXingZuo()); + solar = new Solar(2020,8,22); + Assert.assertEquals(solar.toYmd(),"狮子",solar.getXingZuo()); + } + + @Test + public void test6(){ + Solar solar = new Solar(2020,8,23); + Assert.assertEquals(solar.toYmd(),"处女",solar.getXingZuo()); + solar = new Solar(2020,9,22); + Assert.assertEquals(solar.toYmd(),"处女",solar.getXingZuo()); + } + + @Test + public void test7(){ + Solar solar = new Solar(2020,9,23); + Assert.assertEquals(solar.toYmd(),"天秤",solar.getXingZuo()); + solar = new Solar(2020,10,23); + Assert.assertEquals(solar.toYmd(),"天秤",solar.getXingZuo()); + } + + @Test + public void test8(){ + Solar solar = new Solar(2020,10,24); + Assert.assertEquals(solar.toYmd(),"天蝎",solar.getXingZuo()); + solar = new Solar(2020,11,22); + Assert.assertEquals(solar.toYmd(),"天蝎",solar.getXingZuo()); + } + + @Test + public void test9(){ + Solar solar = new Solar(2020,11,23); + Assert.assertEquals(solar.toYmd(),"射手",solar.getXingZuo()); + solar = new Solar(2020,12,21); + Assert.assertEquals(solar.toYmd(),"射手",solar.getXingZuo()); + } + + @Test + public void test10(){ + Solar solar = new Solar(2020,12,22); + Assert.assertEquals(solar.toYmd(),"摩羯",solar.getXingZuo()); + solar = new Solar(2021,1,19); + Assert.assertEquals(solar.toYmd(),"摩羯",solar.getXingZuo()); + } + + @Test + public void test11(){ + Solar solar = new Solar(2021,1,20); + Assert.assertEquals(solar.toYmd(),"水瓶",solar.getXingZuo()); + solar = new Solar(2021,2,18); + Assert.assertEquals(solar.toYmd(),"水瓶",solar.getXingZuo()); + } + + @Test + public void test12(){ + Solar solar = new Solar(2021,2,19); + Assert.assertEquals(solar.toYmd(),"双鱼",solar.getXingZuo()); + solar = new Solar(2021,3,20); + Assert.assertEquals(solar.toYmd(),"双鱼",solar.getXingZuo()); + } + +}