bazi.ts•5.31 kB
import { calculateRelation, getShen } from 'cantian-tymext';
import {
ChildLimit,
DefaultEightCharProvider,
EightChar,
Gender,
HeavenStem,
LunarHour,
LunarSect2EightCharProvider,
SixtyCycle,
SolarTime,
} from 'tyme4ts';
const eightCharProvider1 = new DefaultEightCharProvider();
const eightCharProvider2 = new LunarSect2EightCharProvider();
export const buildHideHeavenObject = (heavenStem: HeavenStem | null | undefined, me: HeavenStem) => {
if (!heavenStem) {
return undefined;
}
return {
天干: heavenStem.toString(),
十神: me.getTenStar(heavenStem).toString(),
};
};
/**
* @param sixtyCycle 干支。
* @param me 日主,如果sixtyCycle是日柱的话不传值。
*/
export const buildSixtyCycleObject = (sixtyCycle: SixtyCycle, me?: HeavenStem) => {
const heavenStem = sixtyCycle.getHeavenStem();
const earthBranch = sixtyCycle.getEarthBranch();
if (!me) {
me = heavenStem;
}
return {
天干: {
天干: heavenStem.toString(),
五行: heavenStem.getElement().toString(),
阴阳: heavenStem.getYinYang() === 1 ? '阳' : '阴',
十神: me === heavenStem ? undefined : me.getTenStar(heavenStem).toString(),
},
地支: {
地支: earthBranch.toString(),
五行: earthBranch.getElement().toString(),
阴阳: earthBranch.getYinYang() === 1 ? '阳' : '阴',
藏干: {
主气: buildHideHeavenObject(earthBranch.getHideHeavenStemMain(), me),
中气: buildHideHeavenObject(earthBranch.getHideHeavenStemMiddle(), me),
余气: buildHideHeavenObject(earthBranch.getHideHeavenStemResidual(), me),
},
},
纳音: sixtyCycle.getSound().toString(),
旬: sixtyCycle.getTen().toString(),
空亡: sixtyCycle.getExtraEarthBranches().join(''),
星运: me.getTerrain(earthBranch).toString(),
自坐: heavenStem.getTerrain(earthBranch).toString(),
};
};
const buildGodsObject = (eightChar: EightChar, gender: 0 | 1) => {
const gods = getShen(eightChar.toString(), gender);
return {
年柱: gods[0],
月柱: gods[1],
日柱: gods[2],
时柱: gods[3],
};
};
const buildDecadeFortuneObject = (solarTime: SolarTime, gender: Gender, me: HeavenStem) => {
const childLimit = ChildLimit.fromSolarTime(solarTime, gender);
let decadeFortune = childLimit.getStartDecadeFortune();
const firstStartAge = decadeFortune.getStartAge();
const startDate = childLimit.getEndTime();
const decadeFortuneObjects: any[] = [];
for (let i = 0; i < 10; i++) {
const sixtyCycle = decadeFortune.getSixtyCycle();
const heavenStem = sixtyCycle.getHeavenStem();
const earthBranch = sixtyCycle.getEarthBranch();
decadeFortuneObjects.push({
干支: sixtyCycle.toString(),
开始年份: decadeFortune.getStartSixtyCycleYear().getYear(),
结束: decadeFortune.getEndSixtyCycleYear().getYear(),
天干十神: me.getTenStar(heavenStem).getName(),
地支十神: earthBranch.getHideHeavenStems().map((heavenStem) => me.getTenStar(heavenStem.getHeavenStem()).getName()),
地支藏干: earthBranch.getHideHeavenStems().map((heavenStem) => heavenStem.toString()),
开始年龄: decadeFortune.getStartAge(),
结束年龄: decadeFortune.getEndAge(),
});
decadeFortune = decadeFortune.next(1);
}
return {
起运日期: `${startDate.getYear()}-${startDate.getMonth()}-${startDate.getDay()}`,
起运年龄: firstStartAge,
大运: decadeFortuneObjects,
};
};
export const buildBazi = (options: { lunarHour: LunarHour; eightCharProviderSect?: 1 | 2; gender?: Gender }) => {
const { lunarHour, eightCharProviderSect = 2, gender = 1 } = options;
if (eightCharProviderSect === 2) {
LunarHour.provider = eightCharProvider2;
} else {
LunarHour.provider = eightCharProvider1;
}
const eightChar = lunarHour.getEightChar();
const me = eightChar.getDay().getHeavenStem();
return {
性别: ['女', '男'][gender],
阳历: lunarHour.getSolarTime().toString(),
农历: lunarHour.toString(),
八字: eightChar.toString(),
生肖: eightChar.getYear().getEarthBranch().getZodiac().toString(),
日主: me.toString(),
年柱: buildSixtyCycleObject(eightChar.getYear(), me),
月柱: buildSixtyCycleObject(eightChar.getMonth(), me),
日柱: buildSixtyCycleObject(eightChar.getDay()),
时柱: buildSixtyCycleObject(eightChar.getHour(), me),
胎元: eightChar.getFetalOrigin().toString(),
胎息: eightChar.getFetalBreath().toString(),
命宫: eightChar.getOwnSign().toString(),
身宫: eightChar.getBodySign().toString(),
神煞: buildGodsObject(eightChar, gender),
大运: buildDecadeFortuneObject(lunarHour.getSolarTime(), gender, me),
刑冲合会: calculateRelation({
年: { 天干: eightChar.getYear().getHeavenStem().toString(), 地支: eightChar.getYear().getEarthBranch().toString() },
月: { 天干: eightChar.getMonth().getHeavenStem().toString(), 地支: eightChar.getMonth().getEarthBranch().toString() },
日: { 天干: eightChar.getDay().getHeavenStem().toString(), 地支: eightChar.getDay().getEarthBranch().toString() },
时: { 天干: eightChar.getHour().getHeavenStem().toString(), 地支: eightChar.getHour().getEarthBranch().toString() },
}),
};
};