From eb71ea3a56f287b87f1a882ecca7c75108444cf9 Mon Sep 17 00:00:00 2001 From: 6tail <6tail@6tail.cn> Date: Sun, 12 Apr 2020 00:08:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/com/nlf/calendar/Lunar.java | 273 +++++++----------- .../java/com/nlf/calendar/util/LunarUtil.java | 73 ++--- src/test/java/test/TimeTest.java | 2 +- 4 files changed, 124 insertions(+), 226 deletions(-) diff --git a/README.md b/README.md index ab848ae..1cbb5ea 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # lunar [![License](https://img.shields.io/badge/license-MIT-4EB1BA.svg?style=flat-square)](https://github.com/6tail/lunar/blob/master/LICENSE) -lunar是一款无第三方依赖的日历工具,支持公历和农历、星座、干支、生肖、节气、节日、彭祖百忌、吉神方位、冲煞、纳音、星宿、八字、五行、十神等。 +lunar是一款无第三方依赖的公历(阳历)和农历(阴历、老黄历)工具,支持星座、干支、生肖、节气、节日、彭祖百忌、吉神(喜神/福神/财神/阳贵神/阴贵神)方位、胎神方位、冲煞、纳音、星宿、八字、五行、十神、建除十二值星、青龙名堂等十二神、黄道黑道日及吉凶等。 > 支持java 1.5及以上版本。 diff --git a/src/main/java/com/nlf/calendar/Lunar.java b/src/main/java/com/nlf/calendar/Lunar.java index c9e4175..e0bf504 100644 --- a/src/main/java/com/nlf/calendar/Lunar.java +++ b/src/main/java/com/nlf/calendar/Lunar.java @@ -24,10 +24,24 @@ public class Lunar{ private Solar solar; /** 相对于基准日的偏移天数 */ private int dayOffset; - /** 日对应的天干下标,0-10 */ + /** 时对应的天干下标,0-9 */ + private int timeGanIndex; + /** 时对应的地支下标,0-11 */ + private int timeZhiIndex; + /** 日对应的天干下标,0-9 */ private int dayGanIndex; - /** 日对应的地支下标,0-12 */ + /** 日对应的地支下标,0-11 */ private int dayZhiIndex; + /** 月对应的天干下标,0-9 */ + private int monthGanIndex; + /** 月对应的地支下标,0-11 */ + private int monthZhiIndex; + /** 年对应的天干下标,0-9 */ + private int yearGanIndex; + /** 年对应的地支下标,0-11 */ + private int yearZhiIndex; + /** 周下标,0-6 */ + private int weekIndex; /** 阳历小时 */ private int hour; /** 阳历分钟 */ @@ -66,10 +80,7 @@ public class Lunar{ this.day = lunarDay; this.hour = hour; this.minute = minute; - this.dayOffset = LunarUtil.computeAddDays(year,month,day); - int addDays = (dayOffset + LunarUtil.BASE_DAY_GANZHI_INDEX)%60; - dayGanIndex = addDays%10; - dayZhiIndex = addDays%12; + compute(); this.solar = toSolar(); } @@ -125,10 +136,30 @@ public class Lunar{ day = lunarDay; hour = solar.getHour(); minute = solar.getMinute(); + compute(); + } + + private void compute(){ + yearGanIndex = (year-4)%10; + yearZhiIndex = (year-4)%12; + + int m = Math.abs(month); + int leapMonth = LunarUtil.getLeapMonth(year); + if(0==leapMonth||m0){ - return LunarUtil.MONTH[month]; - }else{ - return "闰"+LunarUtil.MONTH[-month]; - } - } - - /** - * 获取时辰(地支) - * @return 时辰(地支) - */ - public String getTimeZhi(){ - String time = (hour<10?"0":"")+hour+":"+(minute<10?"0":"")+minute; - return LunarUtil.convertTime(time); - } - - /** - * 获取时辰(天干) - * @return 时辰(天干) - */ - public String getTimeGan(){ - String zhi = getTimeZhi(); - for(int i=1,j=LunarUtil.ZHI.length;i getBaZi(){ List l = new ArrayList(4); - String dayGan = getDayGan(); - int dayGanIndex = 1; - for(int i=0,j=LunarUtil.GAN.length;i0&&indexDayZhi>0){ - break; - } + int offset = dayZhiIndex-monthZhiIndex; + if(offset<0){ + offset += 12; } - int add = indexDayZhi-indexMonthZhi; - if(add<0){ - add = 12+add; - } - return LunarUtil.ZHI_XING[1+add]; + return LunarUtil.ZHI_XING[offset+1]; } /** @@ -913,16 +860,8 @@ public class Lunar{ */ public String getDayTianShen(){ String monthZhi = getMonthZhi(); - String dayZhi = getDayZhi(); int offset = LunarUtil.MONTH_ZHI_TIAN_SHEN_OFFSET.get(monthZhi); - int dayIndex = 0; - for(int i=0,j=LunarUtil.ZHI.length;i CHONG = new HashMap(){ - private static final long serialVersionUID = -1; - { - put("子","午"); - put("丑","未"); - put("寅","申"); - put("卯","酉"); - put("辰","戌"); - put("巳","亥"); - put("午","子"); - put("未","丑"); - put("申","寅"); - put("酉","卯"); - put("戌","辰"); - put("亥","巳"); - } - }; + public static final String[] CHONG = {"","午","未","申","酉","戌","亥","子","丑","寅","卯","辰","巳"}; /** 天干相冲之无情之克(阳克阳,阴克阴) */ - public static final Map CHONG_GAN = new HashMap(){ - private static final long serialVersionUID = -1; - { - put("甲","戊"); - put("乙","己"); - put("丙","庚"); - put("丁","辛"); - put("戊","壬"); - put("己","癸"); - put("庚","甲"); - put("辛","乙"); - put("壬","丙"); - put("癸","丁"); - } - }; + public static final String[] CHONG_GAN = {"","戊","己","庚","辛","壬","癸","甲","乙","丙","丁"}; /** 天干四冲(无情之克中克得最严重的4个) */ public static final Map CHONG_GAN_BAD = new HashMap(){ private static final long serialVersionUID = -1; @@ -446,21 +416,7 @@ public class LunarUtil{ } }; /** 天干相冲之有情之克(阳克阴,阴克阳) */ - public static final Map CHONG_GAN_TIE = new HashMap(){ - private static final long serialVersionUID = -1; - { - put("甲","己"); - put("乙","戊"); - put("丙","辛"); - put("丁","庚"); - put("戊","癸"); - put("己","壬"); - put("庚","乙"); - put("辛","甲"); - put("壬","丁"); - put("癸","丙"); - } - }; + public static final String[] CHONG_GAN_TIE = {"","己","戊","辛","庚","癸","壬","乙","甲","丁","丙"}; /** 天干五合(有情之克中最有情的5个) */ public static final Map CHONG_GAN_TIE_GOOD = new HashMap(){ private static final long serialVersionUID = -1; @@ -1223,24 +1179,33 @@ public class LunarUtil{ } /** - * 将HH:mm时刻转换为时辰(地支),非法的时刻返回子,null返回null + * 获取HH:mm时刻的地支序号,非法的时刻返回0 * @param hm HH:mm时刻 - * @return 时辰(地支),如子 + * @return 地支序号,0到11 */ - public static String convertTime(String hm){ + public static int getTimeZhiIndex(String hm){ if(null==hm){ - return null; + return 0; } if(hm.length()>5){ hm = hm.substring(0,5); } - int x = 2; + int x = 1; for(int i=1;i<22;i+=2){ if(hm.compareTo((i<10?"0":"")+i+":00")>=0&&hm.compareTo((i+1<10?"0":"")+(i+1)+":59")<=0){ - return ZHI[x]; + return x; } x++; } - return ZHI[1]; + return 0; + } + + /** + * 将HH:mm时刻转换为时辰(地支),非法的时刻返回子 + * @param hm HH:mm时刻 + * @return 时辰(地支),如子 + */ + public static String convertTime(String hm){ + return ZHI[getTimeZhiIndex(hm)+1]; } } diff --git a/src/test/java/test/TimeTest.java b/src/test/java/test/TimeTest.java index b9d0eac..95133c8 100644 --- a/src/test/java/test/TimeTest.java +++ b/src/test/java/test/TimeTest.java @@ -66,7 +66,7 @@ public class TimeTest { put("22:59","亥"); put("21:30","亥"); - put(null,null); + put(null,"子"); put("","子"); put("23:01:01","子");