forked from warrially/BaziGo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbazi.go
143 lines (118 loc) · 3.18 KB
/
bazi.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package bazi
import "fmt"
// NewBazi 新建八字
func NewBazi(pSolarDate *TSolarDate, nSex int) *TBazi {
//
pBazi := &TBazi{
pSolarDate: pSolarDate,
nSex: nSex,
}
return pBazi.init()
}
// NewBaziFromLunarDate 新建八字 从农历
func NewBaziFromLunarDate(pLunarDate *TLunarDate, nSex int) *TBazi {
pBazi := &TBazi{
pLunarDate: pLunarDate,
nSex: nSex,
}
return pBazi.init()
}
// GetBazi 旧版八字接口, 八字入口
func GetBazi(nYear, nMonth, nDay, nHour, nMinute, nSecond, nSex int) *TBazi {
// 先解决时间问题. 然后开始处理八字问题
pSolarDate := NewSolarDate(nYear, nMonth, nDay, nHour, nMinute, nSecond)
if pSolarDate == nil {
return nil
}
return NewBazi(pSolarDate, nSex)
}
// TBazi 八字大类
type TBazi struct {
pSolarDate *TSolarDate // 新历的日期
pLunarDate *TLunarDate // 农历日期
pBaziDate *TBaziDate // 八字历
pSiZhu *TSiZhu // 四柱嗯
nSex int // 性别1男其他女
pDaYun *TDaYun // 大运
pQiYunDate *TSolarDate // 起运时间XX年XX月开始起运
}
// 八字初始化
func (m *TBazi) init() *TBazi {
// 1. 新农互转
if m.pSolarDate == nil {
if m.pLunarDate == nil {
return nil
}
// 农转新
m.pSolarDate = m.pLunarDate.ToSolarDate()
} else {
// 新转农
m.pLunarDate = m.pSolarDate.ToLunarDate()
}
// 1. 拿到新历的情况下, 需要计算八字历
m.pBaziDate = m.pSolarDate.ToBaziDate()
// 2. 根据八字历, 准备计算四柱了
m.pSiZhu = NewSiZhu(m.pSolarDate, m.pBaziDate)
// 3. 计算大运
m.pDaYun = NewDaYun(m.pSiZhu, m.nSex)
// 4. 计算起运时间
m.pQiYunDate = NewQiYun(m.pDaYun.ShunNi(), m.pBaziDate.PreviousJie().ToSolarDate(), m.pBaziDate.NextJie().ToSolarDate(), m.pSolarDate)
// 5. 起运时间融入到大运中
nAge := m.QiYunDate().Year() - m.Date().Year()
for i := 0; i < 12; i++ {
m.pDaYun.nAge[i] = nAge + 10*i
}
return m
}
// String 打印用
func (m *TBazi) String() string {
return fmt.Sprintf("%v\n %v\n %v\n%v\n%v \n起运时间%v", m.pSolarDate, m.pLunarDate, m.pBaziDate, m.pSiZhu, m.pDaYun, m.pQiYunDate)
}
// SiZhu 四柱
func (m *TBazi) SiZhu() *TSiZhu {
return m.pSiZhu
}
// Date 获取日期, 默认就是新历
func (m *TBazi) Date() *TSolarDate {
return m.pSolarDate
}
// SolarData 获取新历日期
func (m *TBazi) SolarData() *TSolarDate {
return m.Date()
}
// LunarDate 获取农历日期
func (m *TBazi) LunarDate() *TLunarDate {
return m.pLunarDate
}
// DaYun 获取大运
func (m *TBazi) DaYun() *TDaYun {
return m.pDaYun
}
// QiYunDate 起运时间
func (m *TBazi) QiYunDate() *TSolarDate {
return m.pQiYunDate
}
// 胎元
func (m *TBazi) TaiYuan() *TGanZhi {
g, z := m.pSiZhu.pMonthZhu.GanZhi().ExtractGanZhi()
return CombineGanZhi(NewGan(g.ToInt()+1), NewZhi(z.ToInt()+3))
}
// 命宫
func (m *TBazi) MingGong() *TGanZhi {
num := (m.pSiZhu.pHourZhu.Zhi().ToInt()+11)%12 + (m.pSiZhu.pMonthZhu.Zhi().ToInt()+11)%12
zhi := 0
if num < 15 {
zhi = (15 - num) % 12
} else {
zhi = (27 - num) % 12
}
yg := m.SiZhu().YearZhu().Gan().ToInt()
fgz := GetYearFirstMonthGanZhi(yg)
for i := 0; i < 12; i++ {
gz := NewGanZhi(i + fgz)
if zhi == gz.ToInt()%12 {
return gz
}
}
return nil
}