218 lines
7.4 KiB
Go
218 lines
7.4 KiB
Go
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
|
|
}
|
|
|
|
}
|
|
|
|
}
|