diff --git a/README.md b/README.md index 3886049..e972a7a 100644 --- a/README.md +++ b/README.md @@ -66,8 +66,8 @@ lunar是一个无依赖的支持阳历和阴历的日历工具库。 输出结果: - 壹玖捌陆年肆月廿一 丙寅(虎)年 癸巳(蛇)月 癸酉(鸡)日 纳音[炉中火 长流水 剑锋金] 星期四 北方玄武 斗木獬 彭祖百忌[癸不词讼理弱敌强 酉不会客醉坐颠狂] 喜神方位[巽](东南) 阳贵神方位[巽](东南) 阴贵神方位[震](正东) 福神方位[兑](正西) 财神方位[离](正南) 冲[(丁卯)兔] 煞[东] - 1986-05-29 星期四 双子座 + 壹玖捌陆年肆月廿一 丙寅(虎)年 癸巳(蛇)月 癸酉(鸡)日 子时 纳音[炉中火 长流水 剑锋金] 星期四 北方玄武 斗木獬 彭祖百忌[癸不词讼理弱敌强 酉不会客醉坐颠狂] 喜神方位[巽](东南) 阳贵神方位[巽](东南) 阴贵神方位[震](正东) 福神方位[兑](正西) 财神方位[离](正南) 冲[(丁卯)兔] 煞[东] + 1986-05-29 00:00 星期四 双子座 ## 文档 diff --git a/README_EN.md b/README_EN.md index cc353a5..80f5239 100644 --- a/README_EN.md +++ b/README_EN.md @@ -66,8 +66,8 @@ If you will use jars in your projects, I suggest you to download latest snapshot Output: - 壹玖捌陆年肆月廿一 丙寅(虎)年 癸巳(蛇)月 癸酉(鸡)日 纳音[炉中火 长流水 剑锋金] 星期四 北方玄武 斗木獬 彭祖百忌[癸不词讼理弱敌强 酉不会客醉坐颠狂] 喜神方位[巽](东南) 阳贵神方位[巽](东南) 阴贵神方位[震](正东) 福神方位[兑](正西) 财神方位[离](正南) 冲[(丁卯)兔] 煞[东] - 1986-05-29 星期四 双子座 + 壹玖捌陆年肆月廿一 丙寅(虎)年 癸巳(蛇)月 癸酉(鸡)日 子时 纳音[炉中火 长流水 剑锋金] 星期四 北方玄武 斗木獬 彭祖百忌[癸不词讼理弱敌强 酉不会客醉坐颠狂] 喜神方位[巽](东南) 阳贵神方位[巽](东南) 阴贵神方位[震](正东) 福神方位[兑](正西) 财神方位[离](正南) 冲[(丁卯)兔] 煞[东] + 1986-05-29 00:00 星期四 双子座 ## Documentation diff --git a/src/main/java/com/nlf/calendar/Lunar.java b/src/main/java/com/nlf/calendar/Lunar.java index f75f5ff..e2d3706 100644 --- a/src/main/java/com/nlf/calendar/Lunar.java +++ b/src/main/java/com/nlf/calendar/Lunar.java @@ -28,6 +28,10 @@ public class Lunar{ private int dayGanIndex; /** 日对应的地支下标,0-12 */ private int dayZhiIndex; + /** 阳历小时 */ + private int hour; + /** 阳历分钟 */ + private int minute; /** * 默认使用当前日期初始化 @@ -39,14 +43,29 @@ public class Lunar{ /** * 通过农历年月日初始化 * - * @param year 年(农历) - * @param month 月(农历),1到12,闰月为负,即闰2月=-2 - * @param day 日(农历),1到31 + * @param lunarYear 年(农历) + * @param lunarMonth 月(农历),1到12,闰月为负,即闰2月=-2 + * @param lunarDay 日(农历),1到31 */ - public Lunar(int year,int month,int day){ - this.year = year; - this.month = month; - this.day = day; + public Lunar(int lunarYear,int lunarMonth,int lunarDay){ + this(lunarYear,lunarMonth,lunarDay,0,0); + } + + /** + * 通过农历年月日时初始化 + * + * @param lunarYear 年(农历) + * @param lunarMonth 月(农历),1到12,闰月为负,即闰2月=-2 + * @param lunarDay 日(农历),1到31 + * @param hour 小时(阳历) + * @param minute 分钟(阳历) + */ + public Lunar(int lunarYear,int lunarMonth,int lunarDay,int hour,int minute){ + this.year = lunarYear; + this.month = lunarMonth; + 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; @@ -104,6 +123,8 @@ public class Lunar{ year = lunarYear; month = lunarMonth; day = lunarDay; + hour = solar.getHour(); + minute = solar.getMinute(); dayOffset = LunarUtil.computeAddDays(year,month,day); int addDays = (dayOffset + LunarUtil.BASE_DAY_GANZHI_INDEX)%60; dayGanIndex = addDays%10; @@ -123,13 +144,27 @@ public class Lunar{ /** * 通过指定农历年月日获取农历 * - * @param year 年(农历) - * @param month 月(农历),1到12,闰月为负,即闰2月=-2 - * @param day 日(农历),1到31 + * @param lunarYear 年(农历) + * @param lunarMonth 月(农历),1到12,闰月为负,即闰2月=-2 + * @param lunarDay 日(农历),1到31 * @return 农历 */ - public static Lunar fromYmd(int year,int month,int day){ - return new Lunar(year,month,day); + public static Lunar fromYmd(int lunarYear,int lunarMonth,int lunarDay){ + return new Lunar(lunarYear,lunarMonth,lunarDay); + } + + /** + * 通过指定农历年月日获取农历 + * + * @param lunarYear 年(农历) + * @param lunarMonth 月(农历),1到12,闰月为负,即闰2月=-2 + * @param lunarDay 日(农历),1到31 + * @param hour 小时(阳历) + * @param minute 分钟(阳历) + * @return 农历 + */ + public static Lunar fromYmdHm(int lunarYear,int lunarMonth,int lunarDay,int hour,int minute){ + return new Lunar(lunarYear,lunarMonth,lunarDay,hour,minute); } /** @@ -227,6 +262,21 @@ public class Lunar{ return ""; } + /** + * 获取时辰生肖 + * + * @return 时辰生肖,如虎 + */ + public String getTimeShengXiao(){ + String zhi = getTimeZhi(); + for(int i=0,j=LunarUtil.ZHI.length;i XIU_LUCK = new HashMap(){ + private static final long serialVersionUID = -1; + { + put("角","吉"); + put("亢","凶"); + put("氐","凶"); + put("房","吉"); + put("心","凶"); + put("尾","吉"); + put("箕","吉"); + put("斗","吉"); + put("牛","凶"); + put("女","凶"); + put("虚","凶"); + put("危","凶"); + put("室","吉"); + put("壁","吉"); + put("奎","凶"); + put("娄","吉"); + put("胃","吉"); + put("昴","凶"); + put("毕","吉"); + put("觜","凶"); + put("参","吉"); + put("井","吉"); + put("鬼","凶"); + put("柳","凶"); + put("星","凶"); + put("张","吉"); + put("翼","凶"); + put("轸","吉"); + } + }; + /** 星宿对应吉凶 */ + public static final Map XIU_SONG = new HashMap(){ + private static final long serialVersionUID = -1; + { + put("角","角星造作主荣昌,外进田财及女郎,嫁娶婚姻出贵子,文人及第见君王,惟有埋葬不可用,三年之后主瘟疫,起工修筑坟基地,堂前立见主人凶。"); + put("亢","亢星造作长房当,十日之中主有殃,田地消磨官失职,接运定是虎狼伤,嫁娶婚姻用此日,儿孙新妇守空房,埋葬若还用此日,当时害祸主重伤。"); + put("氐","氐星造作主灾凶,费尽田园仓库空,埋葬不可用此日,悬绳吊颈祸重重,若是婚姻离别散,夜招浪子入房中,行船必定遭沉没,更生聋哑子孙穷。"); + put("房","房星造作田园进,钱财牛马遍山岗,更招外处田庄宅,荣华富贵福禄康,埋葬若然用此日,高官进职拜君王,嫁娶嫦娥至月殿,三年抱子至朝堂。"); + put("心","心星造作大为凶,更遭刑讼狱囚中,忤逆官非宅产退,埋葬卒暴死相从,婚姻若是用此日,子死儿亡泪满胸,三年之内连遭祸,事事教君没始终。"); + put("尾","尾星造作主天恩,富贵荣华福禄增,招财进宝兴家宅,和合婚姻贵子孙,埋葬若能依此日,男清女正子孙兴,开门放水招田宅,代代公侯远播名。"); + put("箕","箕星造作主高强,岁岁年年大吉昌,埋葬修坟大吉利,田蚕牛马遍山岗,开门放水招田宅,箧满金银谷满仓,福荫高官加禄位,六亲丰禄乐安康。"); + put("斗","斗星造作主招财,文武官员位鼎台,田宅家财千万进,坟堂修筑贵富来,开门放水招牛马,旺蚕男女主和谐,遇此吉宿来照护,时支福庆永无灾。"); + put("牛","牛星造作主灾危,九横三灾不可推,家宅不安人口退,田蚕不利主人衰,嫁娶婚姻皆自损,金银财谷渐无之,若是开门并放水,牛猪羊马亦伤悲。"); + put("女","女星造作损婆娘,兄弟相嫌似虎狼,埋葬生灾逢鬼怪,颠邪疾病主瘟惶,为事遭官财失散,泻利留连不可当,开门放水用此日,全家财散主离乡。"); + put("虚","虚星造作主灾殃,男女孤眠不一双,内乱风声无礼节,儿孙媳妇伴人床,开门放水遭灾祸,虎咬蛇伤又卒亡,三三五五连年病,家破人亡不可当。"); + put("危","危星不可造高楼,自遭刑吊见血光,三年孩子遭水厄,后生出外永不还,埋葬若还逢此日,周年百日取高堂,三年两载一悲伤,开门放水到官堂。"); + put("室","室星修造进田牛,儿孙代代近王侯,家贵荣华天上至,寿如彭祖八千秋,开门放水招财帛,和合婚姻生贵儿,埋葬若能依此日,门庭兴旺福无休。"); + put("壁","壁星造作主增财,丝蚕大熟福滔天,奴婢自来人口进,开门放水出英贤,埋葬招财官品进,家中诸事乐陶然,婚姻吉利主贵子,早播名誉著祖鞭。"); + put("奎","奎星造作得祯祥,家内荣和大吉昌,若是埋葬阴卒死,当年定主两三伤,看看军令刑伤到,重重官事主瘟惶,开门放水遭灾祸,三年两次损儿郎。"); + put("娄","娄星修造起门庭,财旺家和事事兴,外进钱财百日进,一家兄弟播高名,婚姻进益生贵子,玉帛金银箱满盈,放水开门皆吉利,男荣女贵寿康宁。"); + put("胃","胃星造作事如何,家贵荣华喜气多,埋葬贵临官禄位,夫妇齐眉永保康,婚姻遇此家富贵,三灾九祸不逢他,从此门前多吉庆,儿孙代代拜金阶。"); + put("昴","昴星造作进田牛,埋葬官灾不得休,重丧二日三人死,尽卖田园不记增,开门放水招灾祸,三岁孩儿白了头,婚姻不可逢此日,死别生离是可愁。"); + put("毕","毕星造作主光前,买得田园有余钱,埋葬此日添官职,田蚕大熟永丰年,开门放水多吉庆,合家人口得安然,婚姻若得逢此日,生得孩儿福寿全。"); + put("觜","觜星造作有徒刑,三年必定主伶丁,埋葬卒死多因此,取定寅年使杀人,三丧不止皆由此,一人药毒二人身,家门田地皆退败,仓库金银化作尘。"); + put("参","参星造作旺人家,文星照耀大光华,只因造作田财旺,埋葬招疾哭黄沙,开门放水加官职,房房子孙见田加,婚姻许遁遭刑克,男女朝开幕落花。"); + put("井","井星造作旺蚕田,金榜题名第一光,埋葬须防惊卒死,狂颠风疾入黄泉,开门放水招财帛,牛马猪羊旺莫言,贵人田塘来入宅,儿孙兴旺有余钱。"); + put("鬼","鬼星起造卒人亡,堂前不见主人郎,埋葬此日官禄至,儿孙代代近君王,开门放水须伤死,嫁娶夫妻不久长,修土筑墙伤产女,手扶双女泪汪汪。"); + put("柳","柳星造作主遭官,昼夜偷闭不暂安,埋葬瘟惶多疾病,田园退尽守冬寒,开门放水遭聋瞎,腰驼背曲似弓弯,更有棒刑宜谨慎,妇人随客走盘桓。"); + put("星","星宿日好造新房,进职加官近帝王,不可埋葬并放水,凶星临位女人亡,生离死别无心恋,要自归休别嫁郎,孔子九曲殊难度,放水开门天命伤。"); + put("张","张星日好造龙轩,年年并见进庄田,埋葬不久升官职,代代为官近帝前,开门放水招财帛,婚姻和合福绵绵,田蚕人满仓库满,百般顺意自安然。"); + put("翼","翼星不利架高堂,三年二载见瘟惶,埋葬若还逢此日,子孙必定走他乡,婚姻此日不宜利,归家定是不相当,开门放水家须破,少女恋花贪外郎。"); + put("轸","轸星临水造龙宫,代代为官受皇封,富贵荣华增寿禄,库满仓盈自昌隆,埋葬文昌来照助,宅舍安宁不见凶,更有为官沾帝宠,婚姻龙子入龙宫。"); + } + }; /** 兽 */ public static final Map SHOU = new HashMap(){ private static final long serialVersionUID = -1; @@ -642,4 +710,26 @@ public class LunarUtil{ } return d; } + + /** + * 将HH:mm时刻转换为时辰(地支),非法的时刻返回子,null返回null + * @param hm HH:mm时刻 + * @return 时辰(地支),如子 + */ + public static String convertTime(String hm){ + if(null==hm){ + return null; + } + if(hm.length()>5){ + hm = hm.substring(0,5); + } + int x = 2; + 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]; + } + x++; + } + return ZHI[1]; + } } diff --git a/src/test/java/test/LunarTest.java b/src/test/java/test/LunarTest.java index fd4e01d..7694e19 100644 --- a/src/test/java/test/LunarTest.java +++ b/src/test/java/test/LunarTest.java @@ -15,9 +15,9 @@ public class LunarTest { public void test(){ Lunar date = new Lunar(2019,3,27); Assert.assertEquals("贰零壹玖年叁月廿七",date.toString()); - Assert.assertEquals("贰零壹玖年叁月廿七 己亥(猪)年 戊辰(龙)月 戊戌(狗)日 纳音[平地木 大林木 平地木] 星期三 (七殿泰山王诞) 西方白虎 参水猿 彭祖百忌[戊不受田田主不祥 戌不吃犬作怪上床] 喜神方位[巽](东南) 阳贵神方位[艮](东北) 阴贵神方位[坤](西南) 福神方位[坎](正北) 财神方位[坎](正北) 冲[(壬辰)龙] 煞[北]",date.toFullString()); + Assert.assertEquals("贰零壹玖年叁月廿七 己亥(猪)年 戊辰(龙)月 戊戌(狗)日 子时 纳音[平地木 大林木 平地木] 星期三 (七殿泰山王诞) 西方白虎 参水猿 彭祖百忌[戊不受田田主不祥 戌不吃犬作怪上床] 喜神方位[巽](东南) 阳贵神方位[艮](东北) 阴贵神方位[坤](西南) 福神方位[坎](正北) 财神方位[坎](正北) 冲[(壬辰)龙] 煞[北]",date.toFullString()); Assert.assertEquals("2019-05-01",date.getSolar().toString()); - Assert.assertEquals("2019-05-01 星期三 (劳动节) 金牛座",date.getSolar().toFullString()); + Assert.assertEquals("2019-05-01 00:00 星期三 (劳动节) 金牛座",date.getSolar().toFullString()); } } diff --git a/src/test/java/test/SolarTest.java b/src/test/java/test/SolarTest.java index 818722c..b840d2d 100644 --- a/src/test/java/test/SolarTest.java +++ b/src/test/java/test/SolarTest.java @@ -15,9 +15,9 @@ public class SolarTest { public void test(){ Solar date = new Solar(2019,5,1); Assert.assertEquals("2019-05-01",date.toString()); - Assert.assertEquals("2019-05-01 星期三 (劳动节) 金牛座",date.toFullString()); + Assert.assertEquals("2019-05-01 00:00 星期三 (劳动节) 金牛座",date.toFullString()); Assert.assertEquals("贰零壹玖年叁月廿七",date.getLunar().toString()); - Assert.assertEquals("贰零壹玖年叁月廿七 己亥(猪)年 戊辰(龙)月 戊戌(狗)日 纳音[平地木 大林木 平地木] 星期三 (七殿泰山王诞) 西方白虎 参水猿 彭祖百忌[戊不受田田主不祥 戌不吃犬作怪上床] 喜神方位[巽](东南) 阳贵神方位[艮](东北) 阴贵神方位[坤](西南) 福神方位[坎](正北) 财神方位[坎](正北) 冲[(壬辰)龙] 煞[北]",date.getLunar().toFullString()); + Assert.assertEquals("贰零壹玖年叁月廿七 己亥(猪)年 戊辰(龙)月 戊戌(狗)日 酉时 纳音[平地木 大林木 平地木] 星期三 (七殿泰山王诞) 西方白虎 参水猿 彭祖百忌[戊不受田田主不祥 戌不吃犬作怪上床] 喜神方位[巽](东南) 阳贵神方位[艮](东北) 阴贵神方位[坤](西南) 福神方位[坎](正北) 财神方位[坎](正北) 冲[(壬辰)龙] 煞[北]",date.getLunar().toFullString()); } } diff --git a/src/test/java/test/TimeTest.java b/src/test/java/test/TimeTest.java new file mode 100644 index 0000000..b9d0eac --- /dev/null +++ b/src/test/java/test/TimeTest.java @@ -0,0 +1,243 @@ +package test; + +import com.nlf.calendar.Lunar; +import com.nlf.calendar.util.LunarUtil; +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +/** + * 时辰测试 + * + * @author 6tail + */ +public class TimeTest { + + private static final Map ZHI = new HashMap(){ + private static final long serialVersionUID = -1L; + { + put("23:00","子"); + put("00:59","子"); + put("23:30","子"); + + put("01:00","丑"); + put("02:59","丑"); + put("01:30","丑"); + + put("03:00","寅"); + put("04:59","寅"); + put("03:30","寅"); + + put("05:00","卯"); + put("06:59","卯"); + put("05:30","卯"); + + put("07:00","辰"); + put("08:59","辰"); + put("07:30","辰"); + + put("09:00","巳"); + put("10:59","巳"); + put("09:30","巳"); + + put("11:00","午"); + put("12:59","午"); + put("11:30","午"); + + put("13:00","未"); + put("14:59","未"); + put("13:30","未"); + + put("15:00","申"); + put("16:59","申"); + put("15:30","申"); + + put("17:00","酉"); + put("18:59","酉"); + put("17:30","酉"); + + put("19:00","戌"); + put("20:59","戌"); + put("19:30","戌"); + + put("21:00","亥"); + put("22:59","亥"); + put("21:30","亥"); + + put(null,null); + + put("","子"); + put("23:01:01","子"); + put("其他","子"); + + put("21:01:01","亥"); + } + }; + + private static final Map GAN = new HashMap(){ + private static final long serialVersionUID = -1L; + { + put("23:00","甲"); + put("00:59","甲"); + put("23:30","甲"); + + put("01:00","乙"); + put("02:59","乙"); + put("01:30","乙"); + + put("03:00","丙"); + put("04:59","丙"); + put("03:30","丙"); + + put("05:00","丁"); + put("06:59","丁"); + put("05:30","丁"); + + put("07:00","戊"); + put("08:59","戊"); + put("07:30","戊"); + + put("09:00","己"); + put("10:59","己"); + put("09:30","己"); + + put("11:00","庚"); + put("12:59","庚"); + put("11:30","庚"); + + put("13:00","辛"); + put("14:59","辛"); + put("13:30","辛"); + + put("15:00","壬"); + put("16:59","壬"); + put("15:30","壬"); + + put("17:00","癸"); + put("18:59","癸"); + put("17:30","癸"); + + put("19:00","甲"); + put("20:59","甲"); + put("19:30","甲"); + + put("21:00","乙"); + put("22:59","乙"); + put("21:30","乙"); + + put(null,"甲"); + + put("","甲"); + put("23:01:01","甲"); + put("其他","甲"); + put("80:90","甲"); + + put("21:01:01","乙"); + } + }; + + private static final Map GAN_ZHI = new HashMap(){ + private static final long serialVersionUID = -1L; + { + put("23:00","甲子"); + put("00:59","甲子"); + put("23:30","甲子"); + + put("01:00","乙丑"); + put("02:59","乙丑"); + put("01:30","乙丑"); + + put("03:00","丙寅"); + put("04:59","丙寅"); + put("03:30","丙寅"); + + put("05:00","丁卯"); + put("06:59","丁卯"); + put("05:30","丁卯"); + + put("07:00","戊辰"); + put("08:59","戊辰"); + put("07:30","戊辰"); + + put("09:00","己巳"); + put("10:59","己巳"); + put("09:30","己巳"); + + put("11:00","庚午"); + put("12:59","庚午"); + put("11:30","庚午"); + + put("13:00","辛未"); + put("14:59","辛未"); + put("13:30","辛未"); + + put("15:00","壬申"); + put("16:59","壬申"); + put("15:30","壬申"); + + put("17:00","癸酉"); + put("18:59","癸酉"); + put("17:30","癸酉"); + + put("19:00","甲戌"); + put("20:59","甲戌"); + put("19:30","甲戌"); + + put("21:00","乙亥"); + put("22:59","乙亥"); + put("21:30","乙亥"); + + put(null,"甲子"); + + put("","甲子"); + put("23:01:01","甲子"); + put("其他","甲子"); + put("80:90","甲子"); + + put("20:21:01","甲戌"); + put("21:01:01","乙亥"); + put("01:21:01","乙丑"); + } + }; + + @Test + public void testLunarTimeGanZhi(){ + for(Map.Entry entry:GAN_ZHI.entrySet()){ + int hour = 0,minute = 0; + String hm = entry.getKey(); + if(null!=hm&&hm.length()>=5){ + hour = Integer.parseInt(hm.substring(0,2),10); + minute = Integer.parseInt(hm.substring(3,5),10); + } + Lunar lunar = Lunar.fromYmdHm(2020,1,1,hour,minute); + String ganZhi = entry.getValue(); + Assert.assertEquals(hm, ganZhi, lunar.getTimeInGanZhi()); + } + } + @Test + public void testLunarTimeGan(){ + for(Map.Entry entry:GAN.entrySet()){ + int hour = 0,minute = 0; + String hm = entry.getKey(); + if(null!=hm&&hm.length()>=5){ + hour = Integer.parseInt(hm.substring(0,2),10); + minute = Integer.parseInt(hm.substring(3,5),10); + } + Lunar lunar = Lunar.fromYmdHm(2020,1,1,hour,minute); + String gan = entry.getValue(); + Assert.assertEquals(hm, gan, lunar.getTimeGan()); + } + } + + + @Test + public void test(){ + for(Map.Entry entry:ZHI.entrySet()){ + String hm = entry.getKey(); + String zhi = entry.getValue(); + Assert.assertEquals(hm, zhi, LunarUtil.convertTime(hm)); + } + } +}