package calendar import ( "time" "b612.me/astro/basic" ) const ( JQ_春分 = 15 * iota JQ_清明 JQ_谷雨 JQ_立夏 JQ_小满 JQ_芒种 JQ_夏至 JQ_小暑 JQ_大暑 JQ_立秋 JQ_处暑 JQ_白露 JQ_秋分 JQ_寒露 JQ_霜降 JQ_立冬 JQ_小雪 JQ_大雪 JQ_冬至 JQ_小寒 JQ_大寒 JQ_立春 JQ_雨水 JQ_惊蛰 ) // Lunar 公历转农历 // 传入 公历年月日,时区 // 返回 农历月,日,是否闰月以及文字描述 // 按现行农历GB/T 33661-2017算法计算,推荐使用年限为[1929-3000]年 // 古代由于定朔定气误差此处计算会与古时不符 func Lunar(year, month, day int, timezone float64) (int, int, bool, string) { return basic.GetLunar(year, month, day, timezone/24.0) } // Solar 农历转公历 // 传入 农历年份,月,日,是否闰月,时区 // 传出 公历时间 // 农历年份用公历年份代替,但是岁首需要使用农历岁首 // 例:计算己亥猪年腊月三十日对应的公历(即2020年1月24日) // 由于农历还未到鼠年,故应当传入Solar(2019,12,30,false) // 按现行农历GB/T 33661-2017算法计算,推荐使用年限为[1929-3000]年 // 古代由于定朔定气误差此处计算会与古时不符 func Solar(year, month, day int, leap bool, timezone float64) time.Time { jde := basic.GetSolar(year, month, day, leap, timezone/24.0) zone := time.FixedZone("CST", int(timezone*3600)) return basic.JDE2DateByZone(jde, zone, true) } // SolarToLunar 公历转农历 // 传入 公历年月日 // 返回 农历月,日,是否闰月以及文字描述 // 忽略时区,日期一律按北京时间计算 // 按现行农历GB/T 33661-2017算法计算,推荐使用年限为[1929-3000]年 // 古代由于定朔定气误差此处计算会与古时不符 func SolarToLunar(date time.Time) (int, int, bool, string) { return basic.GetLunar(date.Year(), int(date.Month()), date.Day(), 8.0/24.0) } // LunarToSolar 农历转公历 // 传入 农历年份,月,日,是否闰月 // 传出 公历时间 // 农历年份用公历年份代替,但是岁首需要使用农历岁首 // 例:计算己亥猪年腊月三十日对应的公历(即2020年1月24日) // 由于农历还未到鼠年,故应当传入Solar(2019,12,30,false) // 按现行农历GB/T 33661-2017算法计算,推荐使用年限为[1929-3000]年 // 古代由于定朔定气误差此处计算会与古时不符 func LunarToSolar(year, month, day int, leap bool) time.Time { jde := basic.GetSolar(year, month, day, leap, 8.0/24.0) zone := time.FixedZone("CST", 8*3600) return basic.JDE2DateByZone(jde, zone, true) } // GanZhi 返回传入年份对应的干支 func GanZhi(year int) string { return basic.GetGZ(year) } // JieQi 返回传入年份、节气对应的北京时间节气时间 func JieQi(year, term int) time.Time { calcJde := basic.GetJQTime(year, term) zone := time.FixedZone("CST", 8*3600) return basic.JDE2DateByZone(calcJde, zone, false) } // WuHou 返回传入年份、物候对应的北京时间物候时间 func WuHou(year, term int) time.Time { calcJde := basic.GetWHTime(year, term) zone := time.FixedZone("CST", 8*3600) return basic.JDE2DateByZone(calcJde, zone, false) }