lunisolar
Version:
专业农历库,支持公历阴历互转,支持各类黄历数据查询,如八字四柱、阴历、神煞宜忌、时辰吉凶、建除十二神、胎神占方、五行纳音等。支持自定义插件。
135 lines (124 loc) • 4.47 kB
text/typescript
import { CacheClass } from './../../../class/CacheClass'
import { cache } from '../../../utils/decorators'
import type { Stem } from '../../../class/stemBranch'
import type { Char8 } from '../../../class/char8'
import type { Lunisolar } from '../../../class/lunisolar'
import { SB } from '../../../class/stemBranch'
import { Pillar } from './pillar'
import { computeRatStem } from '../../../utils'
import { trans } from '../utils'
import { SBX } from '../types'
import { C8God } from './c8God'
import { createAllC8Gods } from '../utils/c8Gods'
import { branchValue2month, month2BranchValue } from '../utils'
export class Char8Ex extends CacheClass {
readonly _lang: string = 'zh'
readonly me: Stem
readonly char8: Char8
readonly lsr: Lunisolar
readonly sexValue: 0 | 1
readonly year: Pillar
readonly month: Pillar
readonly day: Pillar
readonly hour: Pillar
readonly gods: {
[x in YMDH]: C8God[]
} = { year: [], month: [], day: [], hour: [] }
constructor(lsr: Lunisolar, sexValue: 0 | 1) {
super()
this.sexValue = sexValue
this.lsr = lsr
this.me = lsr.char8.me
this.char8 = lsr.char8
this._lang = lsr.getConfig().lang
const ymdhList = ['year', 'month', 'day', 'hour']
const createPillar = (ymdh: YMDH) => {
return new Pillar({
sb: this.char8[ymdh] as unknown as SBX,
me: this.me,
cate: ymdh,
lang: lsr.char8.getConfig().lang
})
}
this.year = createPillar('year')
this.month = createPillar('month')
this.day = createPillar('day')
this.hour = createPillar('hour')
this.gods = createAllC8Gods(this)
for (let i = 0; i < 4; i++) {
const ymdh: YMDH = ymdhList[i] as YMDH
this[ymdh]._pushGods(this.gods[ymdh])
}
}
get list(): [Pillar, Pillar, Pillar, Pillar] {
return [this.year, this.month, this.day, this.hour]
}
get sex(): string {
return trans(`sex.${this.sexValue}`, this._lang)
}
get missing() {
return this.day.missing
}
/**
* 胎元
* 生月干进一干,
* 生月支进三支
*/
embryo(): SB {
const s = (this.month.stem.value + 1) % 10
const b = (this.month.branch.value + 3) % 12
return new SB(s, b, { lang: this.char8.getConfig().lang })
}
/**
* 命宫
```
口诀:
若问命主何命宫,子起正月逆查行。
生月支上起生时,顺查至卯知命宫。
命宫天干如何定,月柱干支相对应,
年定月诀也可行。
```
* 掌上推命宫法,以排山掌子位为正月,
* 也就是将正月固定在子位上,逆数亥为二月,戌为三月,酉为四月,申为五月,未为六月,午为七月,已为八月,辰为九月,卯为十月,寅为十一月,丑为十二月,
* 然后再把出生时间安在这个月支上,顺数至卯,卯就是命宫。
* 数字计法,寅为1,m = 月+时, m > 14 则26-m, 否则14-m,即为新的月份数,其所在地支为身宫地
*/
ownSign(): SB {
// const month = this.lsr.lunar.month
const month = branchValue2month(this.month.branch.value)
const c8hour = branchValue2month(this.hour.branch.value)
// const monthSign = (13 - month) % 12
// const b = (12 + 3 - c8hour + monthSign) % 12
const newMonth = month + c8hour
const b = month2BranchValue(newMonth > 14 ? 26 - newMonth : 14 - newMonth)
// 命宫天干按五虎遁(五虎遁和五鼠遁本质是一样的)
const s = computeRatStem(this.year.stem.value, b) % 10
return new SB(s, b, { lang: this.char8.getConfig().lang })
}
/**
* 身宫
```
口诀:
身宫口诀记心中,子起正月顺查行。
生月支上起生时,逆推至酉知身宫。
生月天干两头查,顺逆宫支天干停。
子上起正月,顺推到本命生月,生时落生月,逆推至酉
```
* 数学计算法: m = (月份数 + 时辰序号) % 12
*/
bodySign(): SB {
// const month = this.lsr.lunar.month
const month = branchValue2month(this.month.branch.value)
const c8hour = this.hour.branch.value + 1
const b = month2BranchValue((month + c8hour) % 12)
// 查身宫天干
const s = computeRatStem(this.year.stem.value, b) % 10
return new SB(s, b, { lang: this.char8.getConfig().lang })
}
toString() {
return `${this.sex}: ${this.year} ${this.month} ${this.day} ${this.hour}`
}
}