1
0
mirror of synced 2026-04-09 01:48:41 +08:00

从Lunar中单独提出八字(EightChar);八字增加胎元、命宫、身宫;八字增加地势(长生十二神)。

This commit is contained in:
6tail
2020-07-28 23:11:35 +08:00
parent 301ed50ded
commit 221d714dca
5 changed files with 791 additions and 52 deletions

View File

@@ -0,0 +1,456 @@
package com.nlf.calendar;
import com.nlf.calendar.util.LunarUtil;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 八字
* @author 6tail
*/
public class EightChar {
/** 月支,按正月起寅排列 */
private static final String[] MONTH_ZHI = {"","","","","","","","","","","","",""};
/** 长生十二神 */
public static final String[] CHANG_SHENG = {"长生","沐浴","冠带","临官","帝旺","","","","","","",""};
/** 长生十二神日干偏移值,五阳干顺推,五阴干逆推 */
private static final Map<String,Integer> CHANG_SHENG_OFFSET = new HashMap<String, Integer>(){
private static final long serialVersionUID = 1;
{
//阳
put("",11);
put("",2);
put("",2);
put("",5);
put("",8);
//阴
put("",6);
put("",9);
put("",9);
put("",0);
put("",3);
}
};
/** 阴历 */
protected Lunar lunar;
public EightChar(Lunar lunar){
this.lunar = lunar;
}
@Override
public String toString(){
return getYear()+" "+getMonth()+" "+getDay()+" "+getTime();
}
/**
* 获取年柱
* @return 年柱
*/
public String getYear(){
return lunar.getYearInGanZhiExact();
}
/**
* 获取年干
* @return 天干
*/
public String getYearGan(){
return lunar.getYearGanExact();
}
/**
* 获取年支
* @return 地支
*/
public String getYearZhi(){
return lunar.getYearZhiExact();
}
/**
* 获取年柱地支藏干由于藏干分主气、余气、杂气所以返回结果可能为1到3个元素
* @return 天干
*/
public List<String> getYearHideGan(){
return LunarUtil.ZHI_HIDE_GAN.get(getYearZhi());
}
/**
* 获取年柱五行
* @return 五行
*/
public String getYearWuXing(){
return LunarUtil.WU_XING_GAN.get(lunar.getYearGanExact())+LunarUtil.WU_XING_ZHI.get(lunar.getYearZhiExact());
}
/**
* 获取年柱纳音
* @return 纳音
*/
public String getYearNaYin(){
return LunarUtil.NAYIN.get(getYear());
}
/**
* 获取年柱天干十神
* @return 十神
*/
public String getYearShiShenGan(){
return LunarUtil.SHI_SHEN_GAN.get(getDayGan()+getYearGan());
}
private List<String> getYearShiShenZhi(String zhi){
List<String> hideGan = LunarUtil.ZHI_HIDE_GAN.get(zhi);
List<String> l = new ArrayList<String>(hideGan.size());
for(String gan:hideGan){
l.add(LunarUtil.SHI_SHEN_ZHI.get(getDayGan()+zhi+gan));
}
return l;
}
/**
* 获取年柱地支十神由于藏干分主气、余气、杂气所以返回结果可能为1到3个元素
* @return 十神
*/
public List<String> getYearShiShenZhi(){
return getYearShiShenZhi(getYearZhi());
}
private String getDiShi(int zhiIndex){
int offset = CHANG_SHENG_OFFSET.get(getDayGan());
int index = offset + (lunar.getDayGanIndexExact()%2==0?zhiIndex:-zhiIndex);
if(index>=12){
index -= 12;
}
if(index<0){
index += 12;
}
return CHANG_SHENG[index];
}
/**
* 获取年柱地势(长生十二神)
* @return 地势
*/
public String getYearDiShi(){
return getDiShi(lunar.getYearZhiIndexExact());
}
/**
* 获取月柱
* @return 月柱
*/
public String getMonth(){
return lunar.getMonthInGanZhiExact();
}
/**
* 获取月干
* @return 天干
*/
public String getMonthGan(){
return lunar.getMonthGanExact();
}
/**
* 获取月支
* @return 地支
*/
public String getMonthZhi(){
return lunar.getMonthZhiExact();
}
/**
* 获取月柱地支藏干由于藏干分主气、余气、杂气所以返回结果可能为1到3个元素
* @return 天干
*/
public List<String> getMonthHideGan(){
return LunarUtil.ZHI_HIDE_GAN.get(getMonthZhi());
}
/**
* 获取月柱五行
* @return 五行
*/
public String getMonthWuXing(){
return LunarUtil.WU_XING_GAN.get(lunar.getMonthGanExact())+LunarUtil.WU_XING_ZHI.get(lunar.getMonthZhiExact());
}
/**
* 获取月柱纳音
* @return 纳音
*/
public String getMonthNaYin(){
return LunarUtil.NAYIN.get(getMonth());
}
/**
* 获取月柱天干十神
* @return 十神
*/
public String getMonthShiShenGan(){
return LunarUtil.SHI_SHEN_GAN.get(getDayGan()+getMonthGan());
}
/**
* 获取月柱地支十神由于藏干分主气、余气、杂气所以返回结果可能为1到3个元素
* @return 十神
*/
public List<String> getMonthShiShenZhi(){
return getYearShiShenZhi(getMonthZhi());
}
/**
* 获取月柱地势(长生十二神)
* @return 地势
*/
public String getMonthDiShi(){
return getDiShi(lunar.getMonthZhiIndexExact());
}
/**
* 获取日柱
* @return 日柱
*/
public String getDay(){
return lunar.getDayInGanZhiExact();
}
/**
* 获取日干
* @return 天干
*/
public String getDayGan(){
return lunar.getDayGanExact();
}
/**
* 获取日支
* @return 地支
*/
public String getDayZhi(){
return lunar.getDayZhiExact();
}
/**
* 获取日柱地支藏干由于藏干分主气、余气、杂气所以返回结果可能为1到3个元素
* @return 天干
*/
public List<String> getDayHideGan(){
return LunarUtil.ZHI_HIDE_GAN.get(getDayZhi());
}
/**
* 获取日柱五行
* @return 五行
*/
public String getDayWuXing(){
return LunarUtil.WU_XING_GAN.get(lunar.getDayGanExact())+LunarUtil.WU_XING_ZHI.get(lunar.getDayZhiExact());
}
/**
* 获取日柱纳音
* @return 纳音
*/
public String getDayNaYin(){
return LunarUtil.NAYIN.get(getDay());
}
/**
* 获取日柱天干十神,也称日元、日干
* @return 十神
*/
public String getDayShiShenGan(){
return "日主";
}
/**
* 获取日柱地支十神由于藏干分主气、余气、杂气所以返回结果可能为1到3个元素
* @return 十神
*/
public List<String> getDayShiShenZhi(){
return getYearShiShenZhi(getDayZhi());
}
/**
* 获取日柱地势(长生十二神)
* @return 地势
*/
public String getDayDiShi(){
return getDiShi(lunar.getDayZhiIndexExact());
}
/**
* 获取时柱
* @return 时柱
*/
public String getTime(){
return lunar.getTimeInGanZhi();
}
/**
* 获取时干
* @return 天干
*/
public String getTimeGan(){
return lunar.getTimeGan();
}
/**
* 获取时支
* @return 地支
*/
public String getTimeZhi(){
return lunar.getTimeZhi();
}
/**
* 获取时柱地支藏干由于藏干分主气、余气、杂气所以返回结果可能为1到3个元素
* @return 天干
*/
public List<String> getTimeHideGan(){
return LunarUtil.ZHI_HIDE_GAN.get(getTimeZhi());
}
/**
* 获取时柱五行
* @return 五行
*/
public String getTimeWuXing(){
return LunarUtil.WU_XING_GAN.get(lunar.getTimeGan())+LunarUtil.WU_XING_ZHI.get(lunar.getTimeZhi());
}
/**
* 获取时柱纳音
* @return 纳音
*/
public String getTimeNaYin(){
return LunarUtil.NAYIN.get(getTime());
}
/**
* 获取时柱天干十神
* @return 十神
*/
public String getTimeShiShenGan(){
return LunarUtil.SHI_SHEN_GAN.get(getDayGan()+getTimeGan());
}
/**
* 获取时柱地支十神由于藏干分主气、余气、杂气所以返回结果可能为1到3个元素
* @return 十神
*/
public List<String> getTimeShiShenZhi(){
return getYearShiShenZhi(getTimeZhi());
}
/**
* 获取时柱地势(长生十二神)
* @return 地势
*/
public String getTimeDiShi(){
return getDiShi(lunar.getTimeZhiIndex());
}
/**
* 获取胎元
* @return 胎元
*/
public String getTaiYuan(){
int ganIndex = lunar.getMonthGanIndexExact() + 1;
if(ganIndex>10){
ganIndex -= 10;
}
int zhiIndex = lunar.getMonthZhiIndexExact() + 3;
if(zhiIndex>12){
zhiIndex -= 12;
}
return LunarUtil.GAN[ganIndex+1]+LunarUtil.ZHI[zhiIndex+1];
}
/**
* 获取胎元纳音
* @return 纳音
*/
public String getTaiYuanNaYin(){
return LunarUtil.NAYIN.get(getTaiYuan());
}
/**
* 获取命宫
* @return 命宫
*/
public String getMingGong(){
int monthZhiIndex = 0;
int timeZhiIndex = 0;
for(int i=0,j=MONTH_ZHI.length;i<j;i++){
String zhi = MONTH_ZHI[i];
if(lunar.getMonthZhiExact().equals(zhi)){
monthZhiIndex = i;
}
if(lunar.getTimeZhi().equals(zhi)){
timeZhiIndex = i;
}
}
int zhiIndex = 26 - (monthZhiIndex+timeZhiIndex);
if(zhiIndex>12){
zhiIndex -= 12;
}
int jiaZiIndex = LunarUtil.getJiaZiIndex(lunar.getMonthInGanZhiExact()) - (monthZhiIndex-zhiIndex);
if(jiaZiIndex>=60){
jiaZiIndex -= 60;
}
if(jiaZiIndex<0){
jiaZiIndex += 60;
}
return LunarUtil.JIA_ZI[jiaZiIndex];
}
/**
* 获取命宫纳音
* @return 纳音
*/
public String getMingGongNaYin(){
return LunarUtil.NAYIN.get(getMingGong());
}
/**
* 获取身宫
* @return 身宫
*/
public String getShenGong(){
int monthZhiIndex = 0;
int timeZhiIndex = 0;
for(int i=0,j=MONTH_ZHI.length;i<j;i++){
String zhi = MONTH_ZHI[i];
if(lunar.getMonthZhiExact().equals(zhi)){
monthZhiIndex = i;
}
if(lunar.getTimeZhi().equals(zhi)){
timeZhiIndex = i;
}
}
int zhiIndex = (2 + (monthZhiIndex+timeZhiIndex))%12;
int jiaZiIndex = LunarUtil.getJiaZiIndex(lunar.getMonthInGanZhiExact()) - (monthZhiIndex-zhiIndex);
if(jiaZiIndex>=60){
jiaZiIndex -= 60;
}
if(jiaZiIndex<0){
jiaZiIndex += 60;
}
return LunarUtil.JIA_ZI[jiaZiIndex];
}
/**
* 获取身宫纳音
* @return 纳音
*/
public String getShenGongNaYin(){
return LunarUtil.NAYIN.get(getShenGong());
}
}

View File

@@ -72,6 +72,8 @@ public class Lunar{
private int minute;
/** 阳历秒钟 */
private int second;
/** 八字 */
private EightChar eightChar;
/** 24节气表对应阳历的准确时刻 */
private Map<String,Solar> jieQi = new LinkedHashMap<String, Solar>();
@@ -1436,122 +1438,121 @@ public class Lunar{
/**
* 获取八字,男性也称乾造,女性也称坤造(以立春交接时刻作为新年的开始)
* @return 八字(男性也称乾造,女性也称坤造)
* @deprecated 使用getEightChar
*/
@Deprecated
public List<String> getBaZi(){
List<String> l = new ArrayList<String>(4);
l.add(getYearInGanZhiExact());
l.add(getMonthInGanZhiExact());
l.add(getDayInGanZhiExact());
l.add(getTimeInGanZhi());
EightChar eightChar = getEightChar();
l.add(eightChar.getYear());
l.add(eightChar.getMonth());
l.add(eightChar.getDay());
l.add(eightChar.getTime());
return l;
}
/**
* 获取八字五行
* @return 八字五行
* @deprecated 使用getEightChar
*/
@Deprecated
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));
}
List<String> l = new ArrayList<String>(4);
EightChar eightChar = getEightChar();
l.add(eightChar.getYearWuXing());
l.add(eightChar.getMonthWuXing());
l.add(eightChar.getDayWuXing());
l.add(eightChar.getTimeWuXing());
return l;
}
/**
* 获取八字纳音
* @return 八字纳音
* @deprecated 使用getEightChar
*/
@Deprecated
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));
}
List<String> l = new ArrayList<String>(4);
EightChar eightChar = getEightChar();
l.add(eightChar.getYearNaYin());
l.add(eightChar.getMonthNaYin());
l.add(eightChar.getDayNaYin());
l.add(eightChar.getTimeNaYin());
return l;
}
/**
* 获取八字天干十神,日柱十神为日主,其余三柱根据天干十神表查询
* @return 八字天干十神
* @deprecated 使用getEightChar
*/
@Deprecated
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));
List<String> l = new ArrayList<String>(4);
EightChar eightChar = getEightChar();
l.add(eightChar.getYearShiShenGan());
l.add(eightChar.getMonthShiShenGan());
l.add(eightChar.getDayShiShenGan());
l.add(eightChar.getTimeShiShenGan());
return l;
}
/**
* 获取八字地支十神,根据地支十神表查询
* @return 八字地支十神
* @deprecated 使用getEightChar
*/
@Deprecated
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;
}
private List<String> getBaZiShiShenZhi(String zhi){
List<String> baZi = getBaZi();
String dayGan = baZi.get(2).substring(0,1);
List<String> hideGan = LunarUtil.ZHI_HIDE_GAN.get(zhi);
List<String> l = new ArrayList<String>(hideGan.size());
for(String gan:hideGan){
l.add(LunarUtil.SHI_SHEN_ZHI.get(dayGan+zhi+gan));
}
List<String> l = new ArrayList<String>(4);
EightChar eightChar = getEightChar();
l.add(eightChar.getYearShiShenZhi().get(0));
l.add(eightChar.getMonthShiShenZhi().get(0));
l.add(eightChar.getDayShiShenZhi().get(0));
l.add(eightChar.getTimeShiShenZhi().get(0));
return l;
}
/**
* 获取八字年支十神
* @return 八字年支十神
* @deprecated 使用getEightChar
*/
@Deprecated
public List<String> getBaZiShiShenYearZhi(){
List<String> baZi = getBaZi();
return getBaZiShiShenZhi(baZi.get(0).substring(1));
return getEightChar().getYearShiShenZhi();
}
/**
* 获取八字月支十神
* @return 八字月支十神
* @deprecated 使用getEightChar
*/
@Deprecated
public List<String> getBaZiShiShenMonthZhi(){
List<String> baZi = getBaZi();
return getBaZiShiShenZhi(baZi.get(1).substring(1));
return getEightChar().getMonthShiShenZhi();
}
/**
* 获取八字日支十神
* @return 八字日支十神
* @deprecated 使用getEightChar
*/
@Deprecated
public List<String> getBaZiShiShenDayZhi(){
List<String> baZi = getBaZi();
return getBaZiShiShenZhi(baZi.get(2).substring(1));
return getEightChar().getDayShiShenZhi();
}
/**
* 获取八字时支十神
* @return 八字时支十神
* @deprecated 使用getEightChar
*/
@Deprecated
public List<String> getBaZiShiShenTimeZhi(){
List<String> baZi = getBaZi();
return getBaZiShiShenZhi(baZi.get(3).substring(1));
return getEightChar().getTimeShiShenZhi();
}
/**
@@ -2060,7 +2061,46 @@ public class Lunar{
return second;
}
public int getTimeGanIndex() {
return timeGanIndex;
}
public int getTimeZhiIndex() {
return timeZhiIndex;
}
public int getDayGanIndexExact() {
return dayGanIndexExact;
}
public int getDayZhiIndexExact() {
return dayZhiIndexExact;
}
public int getMonthGanIndexExact() {
return monthGanIndexExact;
}
public int getMonthZhiIndexExact() {
return monthZhiIndexExact;
}
public int getYearGanIndexExact(){
return yearGanIndexExact;
}
public int getYearZhiIndexExact(){
return yearZhiIndexExact;
}
public Solar getSolar(){
return solar;
}
public EightChar getEightChar(){
if(null==eightChar){
eightChar = new EightChar(this);
}
return eightChar;
}
}