Skip to content

Commit 1b15c7c

Browse files
author
yuangu
committed
hotfix: 修复Time中的M和m在golang接口导出冲突问题。
1 parent 9efa822 commit 1b15c7c

24 files changed

Lines changed: 1480 additions & 905 deletions

example/golang/main.go

Lines changed: 154 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
$ cd ~/code/sxtwl_cpp
1111
$ mkdir build
1212
$ cd build
13-
$ cmake .. -G "Unix Makefiles" -DSXTWL_WRAPPER_GO=1
13+
$ cmake .. -DSXTWL_WRAPPER_GO=1
1414
$ cmake --build .
1515
1616
编译好了,请把sxtwl.a及sxtwl_cgo.a放到lib目录下,并在sxtwl目录下的init.go加好链接路径
@@ -35,6 +35,52 @@ var Rmc = [...]string{"初一", "初二", "初三", "初四", "初五", "初六"
3535
var XiZ = [...]string{"摩羯", "水瓶", "双鱼", "白羊", "金牛", "双子", "巨蟹", "狮子", "处女", "天秤", "天蝎", "射手"}
3636
var WeekCn = [...]string{"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"}
3737

38+
//=============================================================================================
39+
//做反推的辅助函数
40+
// copy form https://blog.csdn.net/qianguozheng/article/details/52795395
41+
func SubString(str string, begin, length int) string {
42+
fmt.Println("Substring =", str)
43+
rs := []rune(str)
44+
lth := len(rs)
45+
fmt.Printf("begin=%d, end=%d, lth=%d\n", begin, length, lth)
46+
if begin < 0 {
47+
begin = 0
48+
}
49+
if begin >= lth {
50+
begin = lth
51+
}
52+
end := begin + length
53+
54+
if end > lth {
55+
end = lth
56+
}
57+
fmt.Printf("begin=%d, end=%d, lth=%d\n", begin, length, lth)
58+
return string(rs[begin:end])
59+
}
60+
61+
func GetGZ(gzStr string) sxtwl.GZ {
62+
tg := -1
63+
dz := -1
64+
65+
for i, v := range Gan {
66+
if SubString(gzStr, 0, 1) == v {
67+
tg = i
68+
break
69+
}
70+
}
71+
72+
for i, v := range Zhi {
73+
if SubString(gzStr, 1, 1) == v {
74+
tg = i
75+
break
76+
}
77+
}
78+
79+
return sxtwl.NewGZ(tg, dz)
80+
}
81+
82+
//=============================================================================================
83+
3884
func main() {
3985
day := sxtwl.DayFromSolar(2021, 11, 7)
4086

@@ -60,6 +106,112 @@ func main() {
60106
//不以立春为界的农历
61107
fmt.Printf("农历:%d年%s%d月%d日\n", day.GetLunarYear(true), runStr, day.GetLunarMonth(), day.GetLunarDay())
62108

63-
//剩下的例子以后再补,也可以直接参考python的例子来写
109+
// 以春节为界的天干地支
110+
yTG := day.GetYearGZ(true)
111+
fmt.Printf("以春节为界的年干支:%v", Gan[yTG.GetTg()]+Zhi[yTG.GetDz()])
112+
fmt.Printf("以春节为界的生肖:%v", ShX[yTG.GetDz()])
113+
114+
// 以立春为界的天干地支 (注,如果没有传参,或者传false,是以立春为界的。刚好和getLunarYear相反)
115+
yTG = day.GetYearGZ()
116+
fmt.Printf("以立春为界的年干支:%v", Gan[yTG.GetTg()]+Zhi[yTG.GetDz()])
117+
fmt.Printf("以立春为界的生肖:%v", ShX[yTG.GetDz()])
118+
119+
//月干支
120+
mTG := day.GetMonthGZ()
121+
fmt.Printf("月干支:%v", Gan[mTG.GetTg()]+Zhi[mTG.GetDz()])
122+
123+
//日干支
124+
dTG := day.GetDayGZ()
125+
fmt.Printf("日干支%v", Gan[dTG.GetTg()]+Zhi[dTG.GetDz()])
126+
127+
//时干支,传24小时制的时间,分早晚子时
128+
hour := 18
129+
sTG := day.GetHourGZ((byte)(hour))
130+
fmt.Printf("%d时的干支%v", hour, Gan[sTG.GetTg()]+Zhi[sTG.GetDz()])
131+
132+
// 第二种获取时干支方法
133+
//第一个参数为该天的天干,第二个参数为小时
134+
hTG := sxtwl.GetShiGz(dTG.GetTg(), (byte)(hour))
135+
fmt.Printf("%d时天干地支:%v", (hour), Gan[hTG.GetTg()]+Zhi[hTG.GetDz()])
136+
137+
// 当日是否有节气
138+
if day.HasJieQi() {
139+
fmt.Printf("节气:%s", Jqmc[day.GetJieQi()])
140+
//获取节气的儒略日数
141+
jd := day.GetJieQiJD()
142+
// 将儒略日数转换成年月日时秒
143+
t := sxtwl.JD2DD(jd)
144+
fmt.Printf("节气时间:%v", t)
145+
//注意,t.s是小数,需要四舍五入
146+
//fmt.Printf("节气时间:%d-%d-%d %d:%d:%d", t.GetY(), t.GetM(), t.GetD(), t.GetH(), t.GetM(), math.Round(t.GetS()))
147+
} else {
148+
fmt.Println("当天不是节气日")
149+
}
150+
151+
// 四注反查 分别传的是年天干,月天干,日天干,时天干, 开始查询年,结束查询年 返回满足条件的儒略日数
152+
jds := sxtwl.SiZhu2Year(GetGZ("辛丑"), GetGZ("己亥"), GetGZ("丙寅"), GetGZ("癸巳"), 2003, 2029)
153+
for i := 0; i < int(jds.Size()); i++ {
154+
jd := jds.Get(i)
155+
t := sxtwl.JD2DD(jd)
156+
fmt.Printf("符合条件的时间:%v", t)
157+
// print("符合条件的时间:%d-%d-%d %d:%d:%d"%(t.Y, t.M, t.D, t.h, t.m, round(t.s)))
158+
}
159+
160+
// 获取一年中的闰月
161+
year := 2020
162+
month := sxtwl.GetRunMonth(year)
163+
if month >= 0 {
164+
fmt.Printf("%d年的闰月是%d", year, month)
165+
} else {
166+
fmt.Println("没有闰月")
167+
}
168+
169+
// 一个农历月的天数
170+
year = 2020 //农历年
171+
month = 4 //农历月
172+
isRun := false //是否是闰月
173+
daynum := sxtwl.GetLunarMonthNum(year, month, isRun)
174+
runStr = ""
175+
if isRun {
176+
runStr = "闰"
177+
}
178+
fmt.Printf("农历%v年%v%v月的天数:%v", year, runStr, month, daynum)
179+
180+
//儒略日数转公历
181+
jd := sxtwl.J2000
182+
t := sxtwl.JD2DD((float64)(jd))
183+
184+
//公历转儒略日
185+
// jd = sxtwl.ToJD(t)
186+
187+
// 获取某天的后面几天
188+
num := 1 //你喜欢写多少天 也多少天,可以写负数,相当于往前
189+
day = day.After(num) //获取num天后的日信息
190+
fmt.Printf("公历:%d年%d月%d日\n", day.GetSolarYear(), day.GetSolarMonth(), day.GetSolarDay())
191+
192+
// 同上
193+
day = day.Before(num)
194+
fmt.Printf("公历:%d年%d月%d日\n", day.GetSolarYear(), day.GetSolarMonth(), day.GetSolarDay())
195+
196+
// 查找某日前后的节气
197+
for true {
198+
// 这里可以使用after或者before,不用担心速度,这里的计算在底层仅仅是+1这么简单
199+
day = day.After(1)
200+
// hasJieQi的接口比getJieQiJD速度要快,你也可以使用getJieQiJD来判断是否有节气。
201+
if day.HasJieQi() {
202+
fmt.Printf("节气:%s", Jqmc[day.GetJieQi()])
203+
//获取节气的儒略日数, 如果说你要计算什么时间的相距多少,直接比对儒略日要方便,相信我。
204+
jd := day.GetJieQiJD()
205+
206+
// 将儒略日数转换成年月日时秒
207+
t = sxtwl.JD2DD(jd)
208+
fmt.Printf("节气时间:%v", t)
209+
// # 注意,t.s是小数,需要四舍五入
210+
// print("节气时间:%d-%d-%d %d:%d:%d"%(t.Y, t.M, t.D, t.h, t.m, round(t.s)))
211+
212+
break
213+
}
214+
215+
}
64216

65217
}

0 commit comments

Comments
 (0)