218 lines
7.4 KiB
Go
Raw Permalink Normal View History

2024-04-14 20:02:01 +08:00
package main
import (
"fmt"
"sxtwl_example/sxtwl"
)
/**
* 本例子只给了win64的静态库如果需要其它库请自行编译
$ cd ~/code/sxtwl_cpp
$ mkdir build
$ cd build
$ cmake .. -DSXTWL_WRAPPER_GO=1
$ cmake --build .
编译好了请把sxtwl.a及sxtwl_cgo.a放到lib目录下并在sxtwl目录下的init.go加好链接路径
: 如果使用win系统的话请安装mingw32, 作者推荐安装tdm-gcc
然后cmake 命令改成 cmake -G "MinGW Makefiles" .. -DSXTWL_WRAPPER_GO=1
*/
var Gan = [...]string{"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"}
var Zhi = [...]string{"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"}
var ShX = [...]string{"鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"}
var MumCn = [...]string{"零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"}
var Jqmc = [...]string{"冬至", "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏",
"小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降",
"立冬", "小雪", "大雪"}
var Ymc = [...]string{"正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二"}
var Rmc = [...]string{"初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十",
"十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十",
"廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十", "卅一"}
var XiZ = [...]string{"摩羯", "水瓶", "双鱼", "白羊", "金牛", "双子", "巨蟹", "狮子", "处女", "天秤", "天蝎", "射手"}
var WeekCn = [...]string{"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"}
//=============================================================================================
//做反推的辅助函数
// copy form https://blog.csdn.net/qianguozheng/article/details/52795395
func SubString(str string, begin, length int) string {
fmt.Println("Substring =", str)
rs := []rune(str)
lth := len(rs)
fmt.Printf("begin=%d, end=%d, lth=%d\n", begin, length, lth)
if begin < 0 {
begin = 0
}
if begin >= lth {
begin = lth
}
end := begin + length
if end > lth {
end = lth
}
fmt.Printf("begin=%d, end=%d, lth=%d\n", begin, length, lth)
return string(rs[begin:end])
}
func GetGZ(gzStr string) sxtwl.GZ {
tg := -1
dz := -1
for i, v := range Gan {
if SubString(gzStr, 0, 1) == v {
tg = i
break
}
}
for i, v := range Zhi {
if SubString(gzStr, 1, 1) == v {
tg = i
break
}
}
return sxtwl.NewGZ(tg, dz)
}
//=============================================================================================
func main() {
day := sxtwl.DayFromSolar(2021, 11, 7)
// day := sxtwl.DayFromLunar(2020, 12, 1)
// # 如果是想查闰月,第四个参数加一个True即可
// # day = sxtwl.DayFromLunar(2020, 12, 1, true)
fmt.Printf("公历:%v年%v月%v日\n", day.GetSolarYear(), day.GetSolarMonth(), day.GetSolarDay())
// 星期几
fmt.Printf("%v\n", WeekCn[day.GetWeek()])
// 这个月的第几周
fmt.Printf("该日属于这个月的第%v周\n", day.GetWeekIndex())
//以春节为界的农历(注getLunarYear如果没有传参,或者传true,是以春节为界的)
runStr := ""
if day.IsLunarLeap() {
runStr = "闰"
}
fmt.Printf("农历:%d年%s%d月%d日\n", day.GetLunarYear(), runStr, day.GetLunarMonth(), day.GetLunarDay())
//不以立春为界的农历
fmt.Printf("农历:%d年%s%d月%d日\n", day.GetLunarYear(true), runStr, day.GetLunarMonth(), day.GetLunarDay())
// 以春节为界的天干地支
yTG := day.GetYearGZ(true)
fmt.Printf("以春节为界的年干支:%v", Gan[yTG.GetTg()]+Zhi[yTG.GetDz()])
fmt.Printf("以春节为界的生肖:%v", ShX[yTG.GetDz()])
// 以立春为界的天干地支 (注,如果没有传参,或者传false,是以立春为界的。刚好和getLunarYear相反)
yTG = day.GetYearGZ()
fmt.Printf("以立春为界的年干支:%v", Gan[yTG.GetTg()]+Zhi[yTG.GetDz()])
fmt.Printf("以立春为界的生肖:%v", ShX[yTG.GetDz()])
//月干支
mTG := day.GetMonthGZ()
fmt.Printf("月干支:%v", Gan[mTG.GetTg()]+Zhi[mTG.GetDz()])
//日干支
dTG := day.GetDayGZ()
fmt.Printf("日干支%v", Gan[dTG.GetTg()]+Zhi[dTG.GetDz()])
//时干支,传24小时制的时间,分早晚子时
hour := 18
sTG := day.GetHourGZ((byte)(hour))
fmt.Printf("%d时的干支%v", hour, Gan[sTG.GetTg()]+Zhi[sTG.GetDz()])
// 第二种获取时干支方法
//第一个参数为该天的天干,第二个参数为小时
hTG := sxtwl.GetShiGz(dTG.GetTg(), (byte)(hour))
fmt.Printf("%d时天干地支:%v", (hour), Gan[hTG.GetTg()]+Zhi[hTG.GetDz()])
// 当日是否有节气
if day.HasJieQi() {
fmt.Printf("节气:%s", Jqmc[day.GetJieQi()])
//获取节气的儒略日数
jd := day.GetJieQiJD()
// 将儒略日数转换成年月日时秒
t := sxtwl.JD2DD(jd)
fmt.Printf("节气时间:%v", t)
//注意,t.s是小数,需要四舍五入
//fmt.Printf("节气时间:%d-%d-%d %d:%d:%d", t.GetY(), t.GetM(), t.GetD(), t.GetH(), t.GetM(), math.Round(t.GetS()))
} else {
fmt.Println("当天不是节气日")
}
// 四注反查 分别传的是年天干,月天干,日天干,时天干, 开始查询年,结束查询年 返回满足条件的儒略日数
jds := sxtwl.SiZhu2Year(GetGZ("辛丑"), GetGZ("己亥"), GetGZ("丙寅"), GetGZ("癸巳"), 2003, 2029)
for i := 0; i < int(jds.Size()); i++ {
jd := jds.Get(i)
t := sxtwl.JD2DD(jd)
fmt.Printf("符合条件的时间:%v", t)
// print("符合条件的时间:%d-%d-%d %d:%d:%d"%(t.Y, t.M, t.D, t.h, t.m, round(t.s)))
}
// 获取一年中的闰月
year := 2020
month := sxtwl.GetRunMonth(year)
if month >= 0 {
fmt.Printf("%d年的闰月是%d", year, month)
} else {
fmt.Println("没有闰月")
}
// 一个农历月的天数
year = 2020 //农历年
month = 4 //农历月
isRun := false //是否是闰月
daynum := sxtwl.GetLunarMonthNum(year, month, isRun)
runStr = ""
if isRun {
runStr = "闰"
}
fmt.Printf("农历%v年%v%v月的天数:%v", year, runStr, month, daynum)
//儒略日数转公历
jd := sxtwl.J2000
t := sxtwl.JD2DD((float64)(jd))
//公历转儒略日
// jd = sxtwl.ToJD(t)
// 获取某天的后面几天
num := 1 //你喜欢写多少天 也多少天,可以写负数,相当于往前
day = day.After(num) //获取num天后的日信息
fmt.Printf("公历:%d年%d月%d日\n", day.GetSolarYear(), day.GetSolarMonth(), day.GetSolarDay())
// 同上
day = day.Before(num)
fmt.Printf("公历:%d年%d月%d日\n", day.GetSolarYear(), day.GetSolarMonth(), day.GetSolarDay())
// 查找某日前后的节气
for true {
// 这里可以使用after或者before,不用担心速度,这里的计算在底层仅仅是+1这么简单
day = day.After(1)
// hasJieQi的接口比getJieQiJD速度要快,你也可以使用getJieQiJD来判断是否有节气。
if day.HasJieQi() {
fmt.Printf("节气:%s", Jqmc[day.GetJieQi()])
//获取节气的儒略日数, 如果说你要计算什么时间的相距多少,直接比对儒略日要方便,相信我。
jd := day.GetJieQiJD()
// 将儒略日数转换成年月日时秒
t = sxtwl.JD2DD(jd)
fmt.Printf("节气时间:%v", t)
// # 注意,t.s是小数,需要四舍五入
// print("节气时间:%d-%d-%d %d:%d:%d"%(t.Y, t.M, t.D, t.h, t.m, round(t.s)))
break
}
}
}