1
0
mirror of synced 2025-12-27 15:57:59 +08:00

增加八字天干十神、地支十神和八字纳音。

This commit is contained in:
6tail
2020-04-07 22:35:30 +08:00
parent 9aff50ef97
commit 0e667f9d29
6 changed files with 494 additions and 29 deletions

View File

@@ -206,8 +206,8 @@ public class Lunar{
}
/**
* 获取干支纪年
* @return 年份的干支,如辛亥
* 获取干支纪年(年柱)
* @return 年份的干支(年柱),如辛亥
*/
public String getYearInGanZhi(){
return getYearGan()+getYearZhi();
@@ -328,8 +328,8 @@ public class Lunar{
}
/**
* 获取时辰干支
* @return 时辰干支
* 获取时辰干支(时柱)
* @return 时辰干支(时柱)
*/
public String getTimeInGanZhi(){
String zhi = getTimeZhi();
@@ -538,11 +538,11 @@ public class Lunar{
}
/**
* 获取干支纪月
* 获取干支纪月(月柱)
* <p>月天干口诀:甲己丙寅首,乙庚戊寅头。丙辛从庚寅,丁壬壬寅求,戊癸甲寅居,周而复始流。</p>
* <p>月地支:正月起寅</p>
*
* @return 干支纪月,如己卯
* @return 干支纪月(月柱),如己卯
*/
public String getMonthInGanZhi(){
return getMonthGan()+getMonthZhi();
@@ -569,9 +569,9 @@ public class Lunar{
}
/**
* 获取干支纪日
* 获取干支纪日(日柱)
*
* @return 干支纪日,如己卯
* @return 干支纪日(日柱),如己卯
*/
public String getDayInGanZhi(){
return getDayGan()+getDayZhi();
@@ -778,10 +778,11 @@ public class Lunar{
}
/**
* 获取八字
* @return 八字
* 获取八字,男性也称乾造,女性也称坤造
* @return 八字(男性也称乾造,女性也称坤造)
*/
public String getBaZi(){
public List<String> getBaZi(){
List<String> l = new ArrayList<String>(4);
String dayGan = getDayGan();
int dayGanIndex = 1;
for(int i=0,j=LunarUtil.GAN.length;i<j;i++){
@@ -802,21 +803,72 @@ public class Lunar{
}
timeZhiIndex--;
String timeGan = LunarUtil.GAN[(dayGanIndex*12+timeZhiIndex)%10+1];
return getYearInGanZhi()+getMonthInGanZhi()+getDayInGanZhi()+timeGan+getTimeZhi();
l.add(getYearInGanZhi());
l.add(getMonthInGanZhi());
l.add(getDayInGanZhi());
l.add(timeGan+getTimeZhi());
return l;
}
/**
* 获取五行,根据八字推算
* @return 五行
* 获取八字五行
* @return 八字五行
*/
public String getWuXing(){
StringBuilder s = new StringBuilder();
String baZi = getBaZi();
for(int i=0,j=baZi.length();i<j;i++){
String letter = baZi.substring(i,i+1);
s.append(i%2==0?LunarUtil.WU_XING_GAN.get(letter):LunarUtil.WU_XING_ZHI.get(letter));
public List<String> getBaZiWuXing(){
List<String> baZi = getBaZi();
List<String> l = new ArrayList<String>(baZi.size());
for(String ganZhi:baZi){
String gan = ganZhi.substring(0,1);
String zhi = ganZhi.substring(1);
l.add(LunarUtil.WU_XING_GAN.get(gan)+LunarUtil.WU_XING_ZHI.get(zhi));
}
return s.toString();
return l;
}
/**
* 获取八字纳音
* @return 八字纳音
*/
public List<String> getBaZiNaYin(){
List<String> baZi = getBaZi();
List<String> l = new ArrayList<String>(baZi.size());
for(String ganZhi:baZi){
l.add(LunarUtil.NAYIN.get(ganZhi));
}
return l;
}
/**
* 获取八字天干十神,日柱十神为日主,其余三柱根据天干十神表查询
* @return 八字天干十神
*/
public List<String> getBaZiShiShenGan(){
List<String> baZi = getBaZi();
String yearGan = baZi.get(0).substring(0,1);
String monthGan = baZi.get(1).substring(0,1);
String dayGan = baZi.get(2).substring(0,1);
String timeGan = baZi.get(3).substring(0,1);
List<String> l = new ArrayList<String>(baZi.size());
l.add(LunarUtil.SHI_SHEN_GAN.get(dayGan+yearGan));
l.add(LunarUtil.SHI_SHEN_GAN.get(dayGan+monthGan));
l.add("日主");
l.add(LunarUtil.SHI_SHEN_GAN.get(dayGan+timeGan));
return l;
}
/**
* 获取八字地支十神,根据地支十神表查询
* @return 八字地支十神
*/
public List<String> getBaZiShiShenZhi(){
List<String> baZi = getBaZi();
String dayGan = baZi.get(2).substring(0,1);
List<String> l = new ArrayList<String>(baZi.size());
for(String ganZhi:baZi){
String zhi = ganZhi.substring(1);
l.add(LunarUtil.SHI_SHEN_ZHI.get(dayGan+zhi+LunarUtil.ZHI_HIDE_GAN.get(zhi).get(0)));
}
return l;
}
public String toFullString(){
@@ -838,7 +890,7 @@ public class Lunar{
s.append(getTimeZhi());
s.append("(");
s.append(getTimeShengXiao());
s.append(")时 纳音五行[");
s.append(")时 纳音[");
s.append(getYearNaYin());
s.append(" ");
s.append(getMonthNaYin());

View File

@@ -174,7 +174,7 @@ public class LunarUtil{
private static final long serialVersionUID = -1;
{
put("申1","");
put("申2","");
put("申2","");
put("申3","");
put("申4","");
put("申5","");
@@ -182,7 +182,7 @@ public class LunarUtil{
put("申0","");
put("子1","");
put("子2","");
put("子2","");
put("子3","");
put("子4","");
put("子5","");
@@ -190,7 +190,7 @@ public class LunarUtil{
put("子0","");
put("辰1","");
put("辰2","");
put("辰2","");
put("辰3","");
put("辰4","");
put("辰5","");
@@ -654,6 +654,419 @@ public class LunarUtil{
}
};
/** 天干十神,日主+天干为键 */
public static final Map<String,String> SHI_SHEN_GAN = new HashMap<String,String>() {
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("丙癸","正官");
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("己壬","正财");
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("壬乙","伤官");
put("壬丙","偏财");
put("壬丁","正财");
put("壬戊","七杀");
put("壬己","正官");
put("壬庚","偏印");
put("壬辛","正印");
put("癸癸","比肩");
put("癸壬","劫财");
put("癸乙","食神");
put("癸甲","伤官");
put("癸丁","偏财");
put("癸丙","正财");
put("癸己","七杀");
put("癸戊","正官");
put("癸辛","偏印");
put("癸庚","正印");
}
};
/** 地支十神,日主+地支藏干主气为键 */
public static final Map<String,String> SHI_SHEN_ZHI = new HashMap<String,String>() {
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("甲亥甲","比肩");
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("乙亥甲","劫财");
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("丙亥甲","偏印");
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("丁亥甲","正印");
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("戊亥甲","七杀");
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("己亥甲","正官");
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("庚亥甲","偏财");
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("辛亥甲","正财");
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("壬亥甲","食神");
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<String,List<String>> ZHI_HIDE_GAN = new HashMap<String,List<String>>() {
private static final long serialVersionUID = -1;
{
put("",Collections.nCopies(1,""));
put("",Arrays.asList("","",""));
put("",Arrays.asList("","",""));
put("",Collections.nCopies(1,""));
put("",Arrays.asList("","",""));
put("",Arrays.asList("","",""));
put("",Arrays.asList("",""));
put("",Arrays.asList("","",""));
put("",Arrays.asList("","",""));
put("",Collections.nCopies(1,""));
put("",Arrays.asList("","",""));
put("",Arrays.asList("",""));
}
};
protected LunarUtil(){}
/**

View File

@@ -15,7 +15,7 @@ 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 00:00 星期三 (劳动节) 金牛座",date.getSolar().toFullString());
}

View File

@@ -17,7 +17,7 @@ public class SolarTest {
Assert.assertEquals("2019-05-01",date.toString());
Assert.assertEquals("2019-05-01 00:00 星期三 (劳动节) 金牛座",date.toFullString());
Assert.assertEquals("贰零壹玖年叁月廿七",date.getLunar().toString());
Assert.assertEquals("贰零壹玖年叁月廿七 己亥(猪)年 戊辰(龙)月 戊戌(狗)日 子(鼠)时 纳音五行[平地木 大林木 平地木 海中金] 星期三 (七殿泰山王诞) 西方白虎 星宿[参水猿](吉) 彭祖百忌[戊不受田田主不祥 戌不吃犬作怪上床] 喜神方位[巽](东南) 阳贵神方位[艮](东北) 阴贵神方位[坤](西南) 福神方位[坎](正北) 财神方位[坎](正北) 冲[(壬辰)龙] 煞[北]",date.getLunar().toFullString());
Assert.assertEquals("贰零壹玖年叁月廿七 己亥(猪)年 戊辰(龙)月 戊戌(狗)日 子(鼠)时 纳音[平地木 大林木 平地木 海中金] 星期三 (七殿泰山王诞) 西方白虎 星宿[参水猿](吉) 彭祖百忌[戊不受田田主不祥 戌不吃犬作怪上床] 喜神方位[巽](东南) 阳贵神方位[艮](东北) 阴贵神方位[坤](西南) 福神方位[坎](正北) 财神方位[坎](正北) 冲[(壬辰)龙] 煞[北]",date.getLunar().toFullString());
}
}