@@ -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{"初一", "初二", "初三", "初四", "初五", "初六"
3535var XiZ = [... ]string {"摩羯" , "水瓶" , "双鱼" , "白羊" , "金牛" , "双子" , "巨蟹" , "狮子" , "处女" , "天秤" , "天蝎" , "射手" }
3636var 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+
3884func 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