1. 补充农历覆盖到公元前104年

2. 农历信息中包含君主、年号、朝代
3. 丰富一些算法,修正一些问题
This commit is contained in:
2025-09-15 20:55:38 +08:00
parent 438f1700c7
commit d6b6452304
18 changed files with 7048 additions and 458 deletions
-2
View File
@@ -21,5 +21,3 @@ func Date2JDE(date time.Time) float64 {
func JDE2Date(jde float64) time.Time {
return basic.JDE2Date(jde)
}
+338 -59
View File
@@ -1,11 +1,19 @@
package calendar
import (
"fmt"
"math"
"regexp"
"strconv"
"strings"
"time"
"b612.me/astro/basic"
)
var tiangan = []string{"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"}
var dizhi = []string{"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"}
const (
JQ_春分 = 15 * iota
JQ_清明
@@ -38,7 +46,7 @@ const (
// 返回 农历月,日,是否闰月以及文字描述
// 按现行农历GB/T 33661-2017算法计算,推荐使用年限为[1929-3000]年
// 古代由于定朔定气误差此处计算会与古时不符
func Lunar(year, month, day int, timezone float64) (int, int, bool, string) {
func Lunar(year, month, day int, timezone float64) (int, int, int, bool, string) {
return basic.GetLunar(year, month, day, timezone/24.0)
}
@@ -58,31 +66,96 @@ func Solar(year, month, day int, leap bool, timezone float64) time.Time {
// 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)
// 返回 包含农历信息的Time结构体
// 支持年份:[-103,3000]
// [-103,1912] 按照古代历法提供的农历信息
// (1912,3000]按现行农历GB/T 33661-2017算法计算
func SolarToLunar(date time.Time) (Time, error) {
return innerSolarToLunar(date)
}
func innerSolarToLunar(date time.Time) (Time, error) {
if date.Year() < -103 || date.Year() > 3000 {
return Time{}, fmt.Errorf("日期超出范围")
}
if date.Year() <= 1912 {
return innerSolarToLunarHanQing(date), nil
}
if date.Year() < 2400 {
y, m, d, l, desc := rapidLunarModern(date.Year(), int(date.Month()), date.Day())
if desc == "无法获取农历信息" {
return Time{}, fmt.Errorf("无法获取农历信息")
}
return transformModenLunar2Time(date, y, m, d, l, desc), nil
}
y, m, d, l, desc := basic.GetLunar(date.Year(), int(date.Month()), date.Day(), 8.0/24.0)
return transformModenLunar2Time(date, y, m, d, l, desc), nil
}
func transformModenLunar2Time(date time.Time, year, month, day int, leap bool, desc string) Time {
return Time{
solarTime: date,
lunars: []LunarTime{
{
solarDate: date,
year: year,
month: month,
day: day,
leap: leap,
desc: desc,
comment: "",
ganzhiMonth: commonGanZhiOfMonth(year, month),
eras: nil,
},
},
}
}
// 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)
// 传入 农历描述,如"二零二零年正月初一","元丰六年十月十二","元嘉二十七年七月庚午日"
// 传出 包含公里农历信息的Time结构体切片
// 传入参数支持如下结构
// 农历年中文描述+农历月中文描述+农历日中文描述
// 农历年中文描述+农历月中文描述+干支日中文描述
// 年号+农历月中文描述+农历日中文描述
// 年号+农历月中文描述+干支日中文描述
// 支持年份:[-103,3000]
func LunarToSolar(desc string) ([]Time, error) {
dates, err := innerParseLunar(desc)
if err != nil {
return nil, err
}
var results []Time
for _, v := range dates {
date, err := SolarToLunar(v)
if err != nil {
return nil, err
}
results = append(results, date)
}
return results, nil
}
// GanZhi 返回传入年份对应的干支
func GanZhi(year int) string {
return basic.GetGZ(year)
// LunarToSolarSingle 农历转公历
// 传入 农历年月日,是否闰月
// 传出 包含公里农历信息的Time结构体
// 支持年份:[-103,3000]
// [-103,1912] 按照古代历法提供的农历信息,注意,这里农历月份代表的是以当时的历法推定的农历月与正月的距离,正月为1,二月为2,依次类推,闰月显示所闰月
// (1912,3000]按现行农历GB/T 33661-2017算法计算
func LunarToSolarSingle(year, month, day int, leap bool) (Time, error) {
if year < -103 || year > 3000 {
return Time{}, fmt.Errorf("年份超出范围")
}
if year <= 1912 {
date := rapidSolarHan2Qing(year, month, day, leap, yearDiffLunar(year, month, day), nil)
return SolarToLunar(date)
}
if year < 2400 {
date := rapidSolarModern(year, month, day, leap)
return SolarToLunar(date)
}
date := Solar(year, month, day, leap, 8.0)
return SolarToLunar(date)
}
// JieQi 返回传入年份、节气对应的北京时间节气时间
@@ -99,43 +172,11 @@ func WuHou(year, term int) time.Time {
return basic.JDE2DateByZone(calcJde, zone, false)
}
// RapidLunarToSolar 农历转公历(快速查表法)
// 传入 农历年份,月,日,是否闰月
// 传出 公历时间
// 农历年份用公历年份代替,但是岁首需要使用农历岁首
// 例:计算己亥猪年腊月三十日对应的公历(即2020年1月24日)
// 由于农历还未到鼠年,故应当传入Solar(2019,12,30,false)
// 按现行农历GB/T 33661-2017算法计算,推荐使用年限为[1929-3000]年
// 对于东八区[1900-2400]年的查询,会使用查表法加快计算速度
// 古代由于定朔定气误差此处计算会与古时不符
func RapidLunarToSolar(year, month, day int, leap bool) time.Time {
if year < 1900 || year > 2400 {
jde := basic.GetSolar(year, month, day, leap, 8.0/24.0)
zone := time.FixedZone("CST", 8*3600)
return basic.JDE2DateByZone(jde, zone, true)
}
return rapidSolar(year, month, day, leap)
}
// RapidSolarToLunar 公历转农历(快速查表法)
// 传入 公历年月日
// 返回 农历月,日,是否闰月以及文字描述
// 忽略时区,日期一律按北京时间计算
// 按现行农历GB/T 33661-2017算法计算,推荐使用年限为[1929-3000]年
// 古代由于定朔定气误差此处计算会与古时不符
// 对于东八区[1900-2400]年的查询,会使用查表法加快计算速度
func RapidSolarToLunar(date time.Time) (int, int, bool, string) {
if date.Year() < 1900 || date.Year() > 2400 {
return basic.GetLunar(date.Year(), int(date.Month()), date.Day(), 8.0/24.0)
}
return rapidLunar(date.Year(), int(date.Month()), date.Day())
}
func rapidLunar(year, month, day int) (int, int, bool, string) {
func rapidLunarModern(year, month, day int) (int, int, int, bool, string) {
var upper = []uint16{32274, 52242, 41001, 30036, 49204, 36918, 25882, 46101, 34854, 22674, 43026, 31145, 51241, 38964, 26997, 47149, 36885, 23717, 44069, 34258, 53266, 41001, 29036, 49178, 37915, 24875, 46090, 34853, 23698, 43026, 31129, 50229, 38970, 26971, 47126, 36874, 24804, 44068, 32242, 52274, 41013, 28086, 48173, 37909, 25898, 46089, 34852, 22706, 43050, 30189, 50203, 38957, 27989, 47123, 35881, 24788, 45076, 32298, 51258, 40986, 29099, 48170, 37906, 25897, 46121, 34836, 21754, 42038, 31190, 50197, 38949, 27986, 48146, 35881, 23860, 44084, 32309, 51245, 39981, 29093, 49189, 37906, 25897, 46121, 35500, 53274, 42011, 30123, 50218, 38949, 27986, 48146, 36889, 23770, 43066, 32282, 52246, 39978, 29028, 49188, 37938, 24885, 45109, 33846, 22678, 42005, 30186, 51209, 39972, 26994, 47146, 35885, 23853, 43051, 32341, 52242, 41001, 29076, 49172, 37930, 25885, 45082, 33835, 22675, 43026, 30121, 50217, 38964, 27002, 46133, 35862, 23770, 44069, 32466, 52242, 41001, 29108, 48180, 36917, 24950, 45101, 33813, 22674, 43026, 31209, 50217, 38954, 26989, 47131, 34859, 23765, 44068, 34322, 52242, 40985, 29082, 48186, 36890, 24874, 45098, 34852, 21746, 42034, 30197, 50229, 37942, 26966, 47125, 35881, 23828, 44052, 32298, 52266, 39981, 28077, 48171, 37909, 24873, 45097, 34836, 22762, 42010, 30172, 50202, 38955, 26963, 47122, 35881, 24852, 43060, 31290, 51253, 39990, 28058, 48149, 37906, 25897, 45097, 33844, 21686, 42037, 30198, 50221, 39957, 29010, 48146, 36905, 24884, 45098, 32365, 52251, 41003, 30101, 49188, 38930, 26905, 47125, 34842, 22747, 43034, 31210, 50218, 39956, 28018, 48170, 35893, 23866, 44086, 34518, 52245, 41001, 30100, 50196, 37930, 25973, 46124, 34861, 22677, 43029, 31209, 51241, 39956, 28010, 48154, 36892, 23853, 44058, 34507, 53266, 41001, 30100, 49204, 37946, 25946, 45110, 34838, 23754, 43018, 31208, 51240, 39988, 27061, 47149, 35893, 24854, 44053, 34442, 53265, 42024, 29098, 49194, 37933, 25965, 45099, 34837, 23753, 44049, 31192, 51220, 39962, 28059, 47126, 35882, 24852, 45074, 31785, 21652, 41012, 29114, 48181, 37910, 25962, 46121, 34834, 22761, 43049, 31220, 50220, 38957, 28053, 48139, 36901, 25874, 46098, 35433, 53273, 42010, 30125, 50202, 38922, 26917, 47140, 36882, 23769, 43065, 31226, 51254, 39958, 29002, 49162, 37924, 24882, 45106, 34421, 53293, 41005, 30165, 50197, 39945, 26980, 47140, 35882, 23797, 43053, 31277, 51243, 40981, 29001, 49161, 37908, 25898, 45082, 34523, 53270, 42026, 30098, 50194, 38953, 27988, 46132, 34874, 23770, 44054, 31210, 51237, 40978, 29097, 48169, 36916, 24950, 45101, 31797, 21605, 42021, 31186, 50194, 38953, 26988, 47130, 34859, 22765, 44042, 32293, 51236, 40978, 29081, 48185, 35898, 24859, 45078, 34826, 21669, 42020, 30130, 50226, 37941, 25974, 46125, 35861, 22762, 44041, 32228, 52260, 39978, 28077, 48157, 36909, 24853, 45075, 33833, 22676, 43028, 31146, 50234, 39962, 26987, 47146, 36882, 24809, 44073, 34260, 52276, 41014, 29082, 49173, 37926, 26898, 46098, 35497, 54313, 43060, 30197, 50221, 38957, 28005, 47141, 36882, 24809, 45097, 32300, 52250, 40987, 29101, 48170, 37925, 26898, 47122, 34841, 22746, 42042, 31195, 50198, 38954, 28004, 48164, 35890, 23861, 44085, 32310, 51245, 40981, 29098, 50185, 37924, 25970, 46122, 34861, 21614, 42029, 31189, 51218, 38953, 27988, 48148, 36906, 23837, 44058, 32299, 52266, 40978, 29097, 49193, 38932, 24954, 45110, 33846, 22682, 42021, 31186, 51218, 39977, 26996, 47156, 35893, 23862, 43053, 32405, 52261, 42002, 29097, 49193, 37932, 25901, 45083, 33835, 22677, 43044, 31122, 51218, 39961, 27994}
var lower = []uint8{218, 184, 92, 154, 152, 84, 170, 168, 180, 186, 184, 54, 52, 148, 82, 84, 168, 180, 108, 110, 108, 44, 150, 148, 80, 106, 216, 92, 94, 92, 44, 40, 148, 82, 180, 216, 220, 184, 90, 84, 40, 148, 84, 168, 182, 116, 180, 86, 84, 42, 40, 84, 106, 104, 108, 174, 172, 84, 84, 168, 84, 212, 216, 92, 92, 152, 76, 84, 170, 168, 180, 186, 180, 52, 154, 148, 74, 80, 168, 180, 108, 108, 46, 44, 150, 148, 80, 104, 216, 92, 94, 92, 44, 148, 148, 202, 176, 216, 218, 184, 88, 42, 40, 148, 170, 168, 182, 116, 180, 86, 84, 40, 84, 84, 106, 232, 108, 174, 172, 76, 42, 168, 84, 106, 216, 92, 56, 152, 76, 76, 168, 212, 180, 186, 180, 52, 150, 148, 72, 168, 104, 180, 182, 108, 46, 44, 148, 74, 72, 104, 108, 220, 94, 92, 44, 148, 148, 200, 216, 184, 184, 92, 88, 42, 40, 148, 170, 168, 180, 186, 180, 86, 84, 40, 84, 84, 104, 116, 108, 172, 78, 76, 166, 168, 84, 106, 216, 92, 156, 88, 76, 72, 168, 212, 180, 184, 58, 52, 84, 74, 72, 164, 104, 116, 182, 108, 44, 150, 148, 74, 72, 88, 108, 220, 92, 46, 44, 148, 74, 168, 212, 180, 184, 92, 88, 40, 148, 84, 170, 168, 180, 186, 180, 52, 42, 168, 84, 170, 104, 116, 108, 172, 46, 44, 164, 84, 212, 106, 216, 92, 92, 88, 44, 164, 164, 212, 218, 184, 186, 180, 84, 42, 72, 164, 180, 108, 182, 108, 172, 86, 84, 40, 84, 84, 108, 110, 92, 174, 172, 84, 42, 168, 212, 218, 184, 92, 172, 168, 84, 84, 168, 212, 180, 184, 86, 52, 150, 164, 84, 170, 104, 116, 182, 108, 46, 44, 164, 82, 212, 216, 108, 220, 92, 44, 40, 148, 164, 212, 218, 184, 184, 90, 84, 42, 40, 164, 180, 108, 116, 182, 172, 84, 42, 40, 84, 84, 108, 110, 92, 172, 86, 84, 42, 168, 212, 218, 184, 92, 154, 152, 84, 170, 168, 180, 116, 184, 54, 52, 148, 74, 80, 168, 180, 108, 174, 108, 44, 150, 148, 80, 106, 216, 108, 220, 92, 44, 40, 148, 82, 180, 216, 92, 184, 90, 84, 40, 148, 148, 168, 182, 116, 182, 172, 84, 42, 40, 84, 170, 104, 108, 174, 172, 84, 84, 168, 84, 212, 216, 92, 92, 154, 152, 84, 170, 168, 180, 186, 180, 54, 52, 148, 74, 80, 168, 180, 108, 108, 46, 44, 150, 148, 80, 104, 216, 92, 94, 92, 44, 148, 148, 74, 176, 216, 218, 184, 88, 42, 40, 148, 84, 168, 182, 116, 180, 86, 84, 40, 148, 84, 106, 232, 108, 174, 172, 76, 42, 168, 84, 212, 216, 92, 92, 152, 76, 72, 168, 212, 180, 186, 180, 52, 150, 148, 72, 168, 104, 180, 108, 108, 46, 44, 148, 74, 72, 104, 108, 220, 94, 92, 44, 148}
if year < 1900 || year > 2400 {
return 0, 0, false, "超过日期限制"
return 0, 0, 0, false, "超过日期限制"
}
useGoto := false
recalc:
@@ -144,7 +185,7 @@ recalc:
springMonth := (magic&0x800000)>>23 + 1
springDay := (magic & 0x7FFFFF) >> 18
if !useGoto && springMonth == int32(month) && springDay == int32(day) {
return 1, 1, false, "正月初一"
return year, 1, 1, false, "正月初一"
}
if !useGoto && (springMonth > int32(month) || (springMonth == int32(month) && springDay > int32(day))) {
year--
@@ -187,7 +228,7 @@ recalc:
} else {
result += strday[lday/10] + strmonth[lday%10]
}
return lunarMonth, lday, isLeap, result
return year, lunarMonth, lday, isLeap, result
}
totalDay += dayofLunar
lunarMonth++
@@ -198,10 +239,10 @@ recalc:
isLeap = false
}
}
return 0, 0, false, "无法获取农历信息"
return 0, 0, 0, false, "无法获取农历信息"
}
func rapidSolar(year, month, day int, isLeap bool) time.Time {
func rapidSolarModern(year, month, day int, isLeap bool) time.Time {
var upper = []uint16{32274, 52242, 41001, 30036, 49204, 36918, 25882, 46101, 34854, 22674, 43026, 31145, 51241, 38964, 26997, 47149, 36885, 23717, 44069, 34258, 53266, 41001, 29036, 49178, 37915, 24875, 46090, 34853, 23698, 43026, 31129, 50229, 38970, 26971, 47126, 36874, 24804, 44068, 32242, 52274, 41013, 28086, 48173, 37909, 25898, 46089, 34852, 22706, 43050, 30189, 50203, 38957, 27989, 47123, 35881, 24788, 45076, 32298, 51258, 40986, 29099, 48170, 37906, 25897, 46121, 34836, 21754, 42038, 31190, 50197, 38949, 27986, 48146, 35881, 23860, 44084, 32309, 51245, 39981, 29093, 49189, 37906, 25897, 46121, 35500, 53274, 42011, 30123, 50218, 38949, 27986, 48146, 36889, 23770, 43066, 32282, 52246, 39978, 29028, 49188, 37938, 24885, 45109, 33846, 22678, 42005, 30186, 51209, 39972, 26994, 47146, 35885, 23853, 43051, 32341, 52242, 41001, 29076, 49172, 37930, 25885, 45082, 33835, 22675, 43026, 30121, 50217, 38964, 27002, 46133, 35862, 23770, 44069, 32466, 52242, 41001, 29108, 48180, 36917, 24950, 45101, 33813, 22674, 43026, 31209, 50217, 38954, 26989, 47131, 34859, 23765, 44068, 34322, 52242, 40985, 29082, 48186, 36890, 24874, 45098, 34852, 21746, 42034, 30197, 50229, 37942, 26966, 47125, 35881, 23828, 44052, 32298, 52266, 39981, 28077, 48171, 37909, 24873, 45097, 34836, 22762, 42010, 30172, 50202, 38955, 26963, 47122, 35881, 24852, 43060, 31290, 51253, 39990, 28058, 48149, 37906, 25897, 45097, 33844, 21686, 42037, 30198, 50221, 39957, 29010, 48146, 36905, 24884, 45098, 32365, 52251, 41003, 30101, 49188, 38930, 26905, 47125, 34842, 22747, 43034, 31210, 50218, 39956, 28018, 48170, 35893, 23866, 44086, 34518, 52245, 41001, 30100, 50196, 37930, 25973, 46124, 34861, 22677, 43029, 31209, 51241, 39956, 28010, 48154, 36892, 23853, 44058, 34507, 53266, 41001, 30100, 49204, 37946, 25946, 45110, 34838, 23754, 43018, 31208, 51240, 39988, 27061, 47149, 35893, 24854, 44053, 34442, 53265, 42024, 29098, 49194, 37933, 25965, 45099, 34837, 23753, 44049, 31192, 51220, 39962, 28059, 47126, 35882, 24852, 45074, 31785, 21652, 41012, 29114, 48181, 37910, 25962, 46121, 34834, 22761, 43049, 31220, 50220, 38957, 28053, 48139, 36901, 25874, 46098, 35433, 53273, 42010, 30125, 50202, 38922, 26917, 47140, 36882, 23769, 43065, 31226, 51254, 39958, 29002, 49162, 37924, 24882, 45106, 34421, 53293, 41005, 30165, 50197, 39945, 26980, 47140, 35882, 23797, 43053, 31277, 51243, 40981, 29001, 49161, 37908, 25898, 45082, 34523, 53270, 42026, 30098, 50194, 38953, 27988, 46132, 34874, 23770, 44054, 31210, 51237, 40978, 29097, 48169, 36916, 24950, 45101, 31797, 21605, 42021, 31186, 50194, 38953, 26988, 47130, 34859, 22765, 44042, 32293, 51236, 40978, 29081, 48185, 35898, 24859, 45078, 34826, 21669, 42020, 30130, 50226, 37941, 25974, 46125, 35861, 22762, 44041, 32228, 52260, 39978, 28077, 48157, 36909, 24853, 45075, 33833, 22676, 43028, 31146, 50234, 39962, 26987, 47146, 36882, 24809, 44073, 34260, 52276, 41014, 29082, 49173, 37926, 26898, 46098, 35497, 54313, 43060, 30197, 50221, 38957, 28005, 47141, 36882, 24809, 45097, 32300, 52250, 40987, 29101, 48170, 37925, 26898, 47122, 34841, 22746, 42042, 31195, 50198, 38954, 28004, 48164, 35890, 23861, 44085, 32310, 51245, 40981, 29098, 50185, 37924, 25970, 46122, 34861, 21614, 42029, 31189, 51218, 38953, 27988, 48148, 36906, 23837, 44058, 32299, 52266, 40978, 29097, 49193, 38932, 24954, 45110, 33846, 22682, 42021, 31186, 51218, 39977, 26996, 47156, 35893, 23862, 43053, 32405, 52261, 42002, 29097, 49193, 37932, 25901, 45083, 33835, 22677, 43044, 31122, 51218, 39961, 27994}
var lower = []uint8{218, 184, 92, 154, 152, 84, 170, 168, 180, 186, 184, 54, 52, 148, 82, 84, 168, 180, 108, 110, 108, 44, 150, 148, 80, 106, 216, 92, 94, 92, 44, 40, 148, 82, 180, 216, 220, 184, 90, 84, 40, 148, 84, 168, 182, 116, 180, 86, 84, 42, 40, 84, 106, 104, 108, 174, 172, 84, 84, 168, 84, 212, 216, 92, 92, 152, 76, 84, 170, 168, 180, 186, 180, 52, 154, 148, 74, 80, 168, 180, 108, 108, 46, 44, 150, 148, 80, 104, 216, 92, 94, 92, 44, 148, 148, 202, 176, 216, 218, 184, 88, 42, 40, 148, 170, 168, 182, 116, 180, 86, 84, 40, 84, 84, 106, 232, 108, 174, 172, 76, 42, 168, 84, 106, 216, 92, 56, 152, 76, 76, 168, 212, 180, 186, 180, 52, 150, 148, 72, 168, 104, 180, 182, 108, 46, 44, 148, 74, 72, 104, 108, 220, 94, 92, 44, 148, 148, 200, 216, 184, 184, 92, 88, 42, 40, 148, 170, 168, 180, 186, 180, 86, 84, 40, 84, 84, 104, 116, 108, 172, 78, 76, 166, 168, 84, 106, 216, 92, 156, 88, 76, 72, 168, 212, 180, 184, 58, 52, 84, 74, 72, 164, 104, 116, 182, 108, 44, 150, 148, 74, 72, 88, 108, 220, 92, 46, 44, 148, 74, 168, 212, 180, 184, 92, 88, 40, 148, 84, 170, 168, 180, 186, 180, 52, 42, 168, 84, 170, 104, 116, 108, 172, 46, 44, 164, 84, 212, 106, 216, 92, 92, 88, 44, 164, 164, 212, 218, 184, 186, 180, 84, 42, 72, 164, 180, 108, 182, 108, 172, 86, 84, 40, 84, 84, 108, 110, 92, 174, 172, 84, 42, 168, 212, 218, 184, 92, 172, 168, 84, 84, 168, 212, 180, 184, 86, 52, 150, 164, 84, 170, 104, 116, 182, 108, 46, 44, 164, 82, 212, 216, 108, 220, 92, 44, 40, 148, 164, 212, 218, 184, 184, 90, 84, 42, 40, 164, 180, 108, 116, 182, 172, 84, 42, 40, 84, 84, 108, 110, 92, 172, 86, 84, 42, 168, 212, 218, 184, 92, 154, 152, 84, 170, 168, 180, 116, 184, 54, 52, 148, 74, 80, 168, 180, 108, 174, 108, 44, 150, 148, 80, 106, 216, 108, 220, 92, 44, 40, 148, 82, 180, 216, 92, 184, 90, 84, 40, 148, 148, 168, 182, 116, 182, 172, 84, 42, 40, 84, 170, 104, 108, 174, 172, 84, 84, 168, 84, 212, 216, 92, 92, 154, 152, 84, 170, 168, 180, 186, 180, 54, 52, 148, 74, 80, 168, 180, 108, 108, 46, 44, 150, 148, 80, 104, 216, 92, 94, 92, 44, 148, 148, 74, 176, 216, 218, 184, 88, 42, 40, 148, 84, 168, 182, 116, 180, 86, 84, 40, 148, 84, 106, 232, 108, 174, 172, 76, 42, 168, 84, 212, 216, 92, 92, 152, 76, 72, 168, 212, 180, 186, 180, 52, 150, 148, 72, 168, 104, 180, 108, 108, 46, 44, 148, 74, 72, 104, 108, 220, 94, 92, 44, 148}
if year < 1900 || year > 2400 {
@@ -236,3 +277,241 @@ func rapidSolar(year, month, day int, isLeap bool) time.Time {
}
return time.Time{}
}
// 中文数字到阿拉伯数字的映射
var chineseNumbers = map[string]int{
"元": 1, "一": 1, "二": 2, "三": 3, "四": 4, "五": 5,
"六": 6, "七": 7, "八": 8, "九": 9, "十": 10,
"十一": 11, "十二": 12, "十三": 13, "十四": 14, "十五": 15,
"十六": 16, "十七": 17, "十八": 18, "十九": 19, "二十": 20,
"廿一": 21, "廿二": 22, "廿三": 23, "廿四": 24, "廿五": 25,
"廿六": 26, "廿七": 27, "廿八": 28, "廿九": 29, "三十": 30, "卅一": 31,
}
var chineseDays = map[string]int{
"初一": 1, "初二": 2, "初三": 3, "初四": 4, "初五": 5,
"初六": 6, "初七": 7, "初八": 8, "初九": 9, "初十": 10,
"十一": 11, "十二": 12, "十三": 13, "十四": 14, "十五": 15,
"十六": 16, "十七": 17, "十八": 18, "十九": 19, "二十": 20,
"廿一": 21, "廿二": 22, "廿三": 23, "廿四": 24, "廿五": 25,
"廿六": 26, "廿七": 27, "廿八": 28, "廿九": 29, "三十": 30, "卅一": 31,
}
// 中文月份到数字的映射
var chineseMonths = map[string]int{
"正": 1, "腊": 12, "冬": 11, "十一": 11, "十二": 12,
"一": 1, "二": 2, "三": 3, "四": 4, "五": 5, "六": 6,
"七": 7, "八": 8, "九": 9, "十": 10,
}
func parseChineseDate(dateStr string) (LunarTime, error) {
var result LunarTime
var err error
result.desc = dateStr
dateStr = "公元" + dateStr
// 正则表达式匹配日期格式
re := regexp.MustCompile(`^([\p{Han}]+?)([一二三四五六七八九十零〇\d]*?元?)年([\p{Han}\d]+?)月([\p{Han}\d]+?)日?$`)
matches := re.FindStringSubmatch(dateStr)
if len(matches) < 5 {
return result, fmt.Errorf("无效的日期格式: %s", dateStr)
}
matches[1] = strings.TrimPrefix(matches[1], "公元")
// 提取年号
result.comment = matches[1]
// 转换年份
if result.comment != "" {
result.year, err = convertChineseNumber(matches[2])
if err != nil {
return result, fmt.Errorf("无效的年份: %s", matches[2])
}
} else {
// 直接转换年份
if m, _ := regexp.MatchString("\\d+", matches[2]); m {
result.year, err = strconv.Atoi(matches[2])
if err != nil {
return result, fmt.Errorf("无效的年份: %s", matches[2])
}
} else {
result.year = transfer(matches[2], true)
}
}
// 转换月份
monthStr := matches[3]
if strings.HasPrefix(monthStr, "闰") {
result.leap = true
monthStr = strings.TrimPrefix(monthStr, "闰")
}
if month, ok := chineseMonths[monthStr]; ok {
result.month = month
} else {
if m, _ := regexp.MatchString("\\d+", monthStr); m {
result.month, err = strconv.Atoi(monthStr)
} else {
// 尝试将月份字符串转换为数字
result.month, err = convertChineseNumber(monthStr)
}
if err != nil {
return result, fmt.Errorf("无效的月份: %s", monthStr)
}
}
// 转换日期
dayStr := matches[4]
//判断是否是干支日
if len(dayStr) == 6 && strings.ContainsAny(dayStr, "甲乙丙丁戊己庚辛壬癸子丑寅卯辰巳午未申酉戌亥") {
// 临时使用干支月代替
result.ganzhiMonth = dayStr
result.day = 0
return result, nil
}
if day, ok := chineseDays[dayStr]; ok {
result.day = day
} else {
if m, _ := regexp.MatchString("\\d+", dayStr); m {
result.day, err = strconv.Atoi(dayStr)
if err != nil {
return result, fmt.Errorf("无效的日期: %s", dayStr)
}
return result, nil
}
// 尝试将日期字符串转换为数字
result.day, err = convertChineseNumber(dayStr)
if err != nil {
return result, fmt.Errorf("无效的日期: %s", dayStr)
}
}
return result, nil
}
// convertChineseNumber 将中文数字转换为阿拉伯数字
func convertChineseNumber(chineseNum string) (int, error) {
if num, ok := chineseNumbers[chineseNum]; ok {
return num, nil
}
return transfer(chineseNum, false), nil
}
func number2Chinese(num int, isDirectTrans bool) string {
chs := []string{"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"}
if isDirectTrans {
var res string
for i := 0; i < 4; i++ {
tmp := num / (int(math.Pow10(3 - i)))
if tmp == 0 && i == 0 {
continue
}
if tmp < 0 {
res = "负"
num = -num
}
res += chs[tmp]
num = num % (int(math.Pow10(3 - i)))
}
return res
}
if num < 0 || num > 99 {
return ""
}
if num < 10 {
return chs[num]
}
if num == 10 {
return "十"
}
if num < 20 {
return "十" + chs[num-10]
}
if num%10 == 0 {
return chs[num/10] + "十"
}
return chs[num/10] + "十" + chs[num%10]
}
func transfer(msg string, direct bool) int {
keyMap := map[rune]int{
'': 0, '零': 0, '一': 1, '二': 2, '三': 3, '四': 4, '五': 5, '六': 6, '七': 7, '八': 8, '九': 9, '十': 10, '百': 100, '千': 1000, '万': 10000, '亿': 100000000, '两': 2, '俩': 2,
}
result := 0
if direct {
for _, num := range []rune(msg) {
if val, match := keyMap[num]; match {
result = result*10 + val
} else {
return 0
}
}
return result
}
secCache := 0
thrCache := 0
fKWord := map[rune]int{'百': 100, '千': 1000, '万': 10000, '亿': 100000000}
for _, num := range []rune(msg) {
if _, match := fKWord[num]; !match {
if num == '十' && thrCache != 0 {
thrCache *= keyMap[num]
} else {
thrCache += keyMap[num]
}
} else {
if fKWord[num] < 10000 {
secCache += thrCache * fKWord[num]
thrCache = 0
} else {
secCache += thrCache
thrCache = 0
if secCache == 0 {
result *= fKWord[num]
continue
}
result += secCache * fKWord[num]
secCache = 0
}
}
}
result += secCache + thrCache
return result
}
// GanZhiOfYear 返回传入年份对应的干支
func GanZhiOfYear(year int) string {
return basic.GetGZ(year)
}
// GanZhiOfDay
func GanZhiOfDay(t time.Time) string {
jde := Date2JDE(time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, time.Local))
diff := int(jde - 2451550.5)
if diff >= 0 {
return tiangan[diff%10] + dizhi[diff%12]
}
return tiangan[(diff%10+10)%10] + dizhi[(diff%12+12)%12]
}
// 获取每年建寅月的天干
func tianGanIndexForFirstMonth(year int) int {
diff := (year - 1998) * 2
if diff >= 0 {
return diff % 10
}
return (diff%10 + 10) % 10
}
// commonGanZhiOfMonth 返回常规以建寅为正月时,指定农历月份的干支
func commonGanZhiOfMonth(year, month int) string {
start := tianGanIndexForFirstMonth(year)
index := (start + month - 1) % 10
return tiangan[index] + dizhi[(month+1)%12]
}
func ganZhiOfDayIndex(t time.Time) (int, int) {
jde := Date2JDE(time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, time.Local))
diff := int(jde - 2451550.5)
if diff >= 0 {
return diff % 10, diff % 12
}
return (diff%10 + 10) % 10, (diff%12 + 12) % 10
}
File diff suppressed because one or more lines are too long
+407
View File
@@ -0,0 +1,407 @@
package calendar
func liaoJinYuanCals() map[int]uint32 {
return map[int]uint32{
949: 2996838400,
955: 1237097216,
958: 2858129152,
959: 1787832832,
961: 766088192,
964: 2574266112,
965: 1232086016,
973: 2464163072,
985: 3031177216,
986: 1788881664,
994: 3645910016,
999: 2775716864,
1001: 3530398464,
1012: 3579124224,
1015: 2513671936,
1020: 2992512000,
1021: 1787833856,
1024: 727723008,
1025: 2507153408,
1029: 1783730688,
1039: 3667270400,
1040: 3046125056,
1044: 2463113472,
1045: 3378156800,
1049: 2907710464,
1053: 2461767424,
1056: 1823052800,
1059: 2605723136,
1064: 3912439040,
1070: 1255156992,
1073: 2991597824,
1075: 3601470208,
1077: 2513836800,
1078: 2511351296,
1080: 2763790592,
1094: 728372224,
1105: 2733216256,
1113: 635048960,
1121: 1269470464,
1129: 2874414592,
1134: 3529513728,
1145: 3041761536,
1147: 3445629184,
1152: 1689265920,
1155: 1530929920,
1163: 3595576320,
1168: 2461018624,
1176: 628108288,
1178: 2839221504,
1184: 1264594176,
1198: 3040880384,
1207: 2904563200,
1209: 727721472,
1239: 1370498304,
1250: 3576701440,
1251: 1520769024,
1253: 1523588864,
1256: 2732596480,
1258: 3511690240,
1263: 2513447168,
1270: 3047528192,
1273: 1169888512,
1276: 1784254976,
}
}
func liaoJinYuanEras() []Era {
return []Era{
{
Year: 1264,
Emperor: "元世祖",
OtherNianHaoStart: "至元",
Dynasty: "元",
},
{
Year: 1260,
Emperor: "元世祖",
Nianhao: "中统",
Dynasty: "元",
},
{
Year: 1251,
Emperor: "元宪宗",
Nianhao: "元宪宗",
Dynasty: "元",
},
{
Year: 1249,
Emperor: "元定宗后",
Nianhao: "元定宗后",
Dynasty: "元",
},
{
Year: 1246,
Emperor: "元定宗",
Nianhao: "元定宗",
Dynasty: "元",
},
{
Year: 1242,
Emperor: "元太宗",
Nianhao: "元太宗后",
Dynasty: "元",
},
{
Year: 1234,
Emperor: "元太宗",
OtherNianHaoStart: "元太宗",
Dynasty: "元",
Offset: 5,
},
{
Year: 1232,
Emperor: "金哀宗",
Nianhao: "天兴",
Dynasty: "金",
},
{
Year: 1224,
Emperor: "金哀宗",
Nianhao: "正大",
Dynasty: "金",
},
{
Year: 1222,
Emperor: "金宣宗",
OtherNianHaoStart: "元光",
Dynasty: "金",
},
{
Year: 1217,
Emperor: "金宣宗",
OtherNianHaoStart: "兴定",
Dynasty: "金",
},
{
Year: 1213,
Emperor: "金宣宗",
OtherNianHaoStart: "贞佑",
Dynasty: "金",
},
{
Year: 1213,
Emperor: "金宣宗",
OtherNianHaoStart: "至宁",
Dynasty: "金",
},
{
Year: 1212,
Emperor: "金卫绍王",
OtherNianHaoStart: "崇庆",
Dynasty: "金",
},
{
Year: 1209,
Emperor: "金卫绍王",
Nianhao: "大安",
Dynasty: "金",
},
{
Year: 1201,
Emperor: "金章宗",
Nianhao: "泰和",
Dynasty: "金",
},
{
Year: 1196,
Emperor: "金章宗",
OtherNianHaoStart: "承安",
Dynasty: "金",
},
{
Year: 1190,
Emperor: "金章宗",
Nianhao: "明昌",
Dynasty: "金",
},
{
Year: 1161,
Emperor: "金世宗",
OtherNianHaoStart: "大定",
Dynasty: "金",
},
{
Year: 1156,
Emperor: "金海陵王",
OtherNianHaoStart: "正隆",
Dynasty: "金",
},
{
Year: 1153,
Emperor: "金海陵王",
OtherNianHaoStart: "贞元",
Dynasty: "金",
},
{
Year: 1149,
Emperor: "金海陵王",
OtherNianHaoStart: "天德",
Dynasty: "金",
},
{
Year: 1141,
Emperor: "金熙宗",
Nianhao: "皇统",
Dynasty: "金",
},
{
Year: 1138,
Emperor: "金熙宗",
Nianhao: "天眷",
Dynasty: "金",
},
{
Year: 1125,
Emperor: "金太宗",
OtherNianHaoStart: "天会",
Dynasty: "金",
Offset: 2,
},
{
Year: 1121,
Emperor: "辽天祚帝",
Nianhao: "保大",
Dynasty: "辽",
},
{
Year: 1111,
Emperor: "辽天祚帝",
Nianhao: "天庆",
Dynasty: "辽",
},
{
Year: 1101,
Emperor: "辽天祚帝",
OtherNianHaoStart: "乾统",
Dynasty: "辽",
},
{
Year: 1095,
Emperor: "辽道宗",
Nianhao: "寿昌",
Dynasty: "辽",
},
{
Year: 1085,
Emperor: "辽道宗",
Nianhao: "大安",
Dynasty: "辽",
},
{
Year: 1075,
Emperor: "辽道宗",
Nianhao: "大康",
Dynasty: "辽",
},
{
Year: 1065,
Emperor: "辽道宗",
Nianhao: "咸雍",
Dynasty: "辽",
},
{
Year: 1055,
Emperor: "辽道宗",
OtherNianHaoStart: "清宁",
Dynasty: "辽",
},
{
Year: 1032,
Emperor: "辽兴宗",
OtherNianHaoStart: "重熙",
Dynasty: "辽",
},
{
Year: 1031,
Emperor: "辽兴宗",
OtherNianHaoStart: "景福",
Dynasty: "辽",
},
{
Year: 1021,
Emperor: "辽圣宗",
OtherNianHaoStart: "太平",
Dynasty: "辽",
},
{
Year: 1012,
Emperor: "辽圣宗",
OtherNianHaoStart: "开泰",
Dynasty: "辽",
},
{
Year: 983,
Emperor: "辽圣宗",
OtherNianHaoStart: "统和",
Dynasty: "辽",
},
{
Year: 979,
Emperor: "辽景宗",
OtherNianHaoStart: "乾亨",
Dynasty: "辽",
},
{
Year: 969,
Emperor: "辽景宗",
OtherNianHaoStart: "保宁",
Dynasty: "辽",
},
{
Year: 951,
Emperor: "辽穆宗",
OtherNianHaoStart: "应历",
Dynasty: "辽",
},
{
Year: 947,
Emperor: "辽世宗",
OtherNianHaoStart: "天禄",
Dynasty: "辽",
},
{
Year: 947,
Emperor: "辽太宗",
Nianhao: "大同",
Dynasty: "辽",
},
{
Year: 939,
Emperor: "辽太宗",
OtherNianHaoStart: "会同",
Dynasty: "辽",
},
}
}
func liaoJinYuanEraMap() map[string][][]int {
return map[string][][]int{
"中统": [][]int{{1260, 1264}},
"元宪宗": [][]int{{1251, 1259}},
"元定宗后": [][]int{{1249, 1250}},
"元定宗": [][]int{{1246, 1248}},
"元太宗后": [][]int{{1242, 1245}},
"元太宗": [][]int{{1229, 1241}},
"天兴": [][]int{{1232, 1229}},
"正大": [][]int{{1224, 1231}},
"元光": [][]int{{1222, 1223}},
"兴定": [][]int{{1217, 1222}},
"贞佑": [][]int{{1213, 1217}},
"至宁": [][]int{{1213, 1213}},
"崇庆": [][]int{{1212, 1213}},
"泰和": [][]int{{1201, 1208}},
"承安": [][]int{{1196, 1200}},
"明昌": [][]int{{1190, 1196}},
"大定": [][]int{{1161, 1189}},
"正隆": [][]int{{1156, 1161}},
"贞元": [][]int{{1153, 1156}},
"天德": [][]int{{1149, 1153}},
"皇统": [][]int{{1141, 1149}},
"天眷": [][]int{{1138, 1140}},
"天会": [][]int{{1123, 1137}},
"保大": [][]int{{1121, 1125}},
"天庆": [][]int{{1111, 1120}},
"乾统": [][]int{{1101, 1110}},
"寿昌": [][]int{{1095, 1101}},
"大安": [][]int{{1085, 1094}, {1209, 1212}},
"大康": [][]int{{1075, 1084}},
"咸雍": [][]int{{1065, 1074}},
"清宁": [][]int{{1055, 1064}},
"重熙": [][]int{{1032, 1055}},
"景福": [][]int{{1031, 1032}},
"太平": [][]int{{1021, 1031}},
"开泰": [][]int{{1012, 1021}},
"统和": [][]int{{983, 1012}},
"乾亨": [][]int{{979, 983}},
"保宁": [][]int{{969, 979}},
"应历": [][]int{{951, 969}},
"天禄": [][]int{{947, 951}},
"大同": [][]int{{947, 947}},
"会同": [][]int{{939, 946}},
}
}
func innerSolarToLunarLiaoJinYuan(date Time) Time {
year := date.solarTime.Year()
month := int(date.solarTime.Month())
day := date.solarTime.Day()
if year >= 947 && year <= 1279 {
lyear, lmonth, ganzhiMonth, lday, isLeap, ldesc := rapidLunarHan2Qing(year, month, day, 0, liaoJinYuanCals)
date.lunars = append(date.lunars, LunarTime{
year: lyear,
month: lmonth,
day: lday,
leap: isLeap,
desc: ldesc,
comment: "",
ganzhiMonth: ganzhiMonth,
eras: innerEras(lyear, liaoJinYuanEras),
})
}
return date
}
+916
View File
@@ -0,0 +1,916 @@
package calendar
// 后秦
func houQinCals() map[int]uint32 {
return map[int]uint32{
384: 2862622464,
385: 3042089728,
386: 2874158592,
387: 1431315456,
388: 2863175936,
389: 1788881664,
390: 2874482688,
391: 2863674112,
392: 1431316736,
393: 1789631744,
394: 1453338624,
395: 2863670528,
396: 1431411456,
397: 3578801152,
398: 1454219776,
399: 1432368384,
400: 2862623232,
401: 3579059712,
402: 2907713792,
403: 1432364800,
404: 2863307776,
405: 2862624256,
406: 2907710208,
407: 1432951040,
408: 1431317504,
409: 2863472640,
410: 1520448256,
411: 2865768448,
412: 1432034816,
413: 1431318528,
414: 1520444672,
415: 2865863168,
416: 2863672576,
417: 1431708160,
}
}
func houQinEras() []Era {
return []Era{
{
Year: 416,
Emperor: "后秦末主",
OtherNianHaoStart: "永和",
Dynasty: "后秦",
},
{
Year: 399,
Emperor: "后秦文桓帝",
OtherNianHaoStart: "弘始",
Dynasty: "后秦",
},
{
Year: 394,
Emperor: "后秦文桓帝",
OtherNianHaoStart: "皇初",
Dynasty: "后秦",
},
{
Year: 386,
Emperor: "后秦武昭帝",
OtherNianHaoStart: "建初",
Dynasty: "后秦",
},
{
Year: 384,
Emperor: "后秦武昭帝",
Nianhao: "白雀",
Dynasty: "后秦",
},
}
}
func houQinEraMap() map[string][][]int {
return map[string][][]int{
"永和": [][]int{{416, 417}},
"弘始": [][]int{{399, 416}},
"皇初": [][]int{{394, 399}},
"建初": [][]int{{386, 394}},
"白雀": [][]int{{384, 386}},
}
}
// 北魏、西魏、北周、隋
func weiZhouSuiCals() map[int]uint32 {
return map[int]uint32{
398: 1454219776,
399: 1436562688,
400: 2862623232,
401: 3579059712,
402: 2907713792,
403: 1436559104,
404: 2863307776,
405: 2862624256,
406: 2907710208,
407: 1437145344,
408: 1431317504,
409: 2863472640,
410: 1520448256,
411: 2874157056,
412: 1432034816,
413: 1431318528,
414: 1520444672,
415: 2874251776,
416: 2863672576,
417: 1431708160,
418: 3041932288,
419: 1453337088,
420: 2863931136,
421: 2862625024,
422: 3041928704,
423: 1453988864,
424: 1432366848,
425: 2862621440,
426: 3041957888,
427: 2907712256,
428: 1433215232,
429: 1431319296,
430: 2862622720,
431: 2907905280,
432: 2865770496,
433: 1431315712,
434: 1789499904,
435: 1520446720,
436: 2866160128,
437: 2862625792,
438: 3578800384,
439: 1521262336,
440: 1436561920,
441: 2862622208,
442: 3578960640,
443: 3041930752,
444: 1436558336,
445: 2863175680,
446: 2862623488,
447: 3042254848,
448: 2874159872,
449: 1431316480,
450: 2863373568,
451: 1788882944,
452: 2874156288,
453: 1432033792,
454: 1431317760,
455: 1520443904,
456: 2874218240,
457: 2863671552,
458: 1431641856,
459: 3041931520,
460: 1453336320,
461: 2863897344,
462: 2862624256,
463: 3041927936,
464: 1453988096,
465: 1432365824,
466: 2862620672,
467: 3041957120,
468: 2907711488,
469: 1433181440,
470: 1431318528,
471: 1788880128,
472: 2907904512,
473: 2865769472,
474: 1431314944,
475: 1789499136,
476: 1520445952,
477: 2866126336,
478: 2862625024,
479: 3578799616,
480: 1521196032,
481: 1436560896,
482: 2862621440,
483: 3578927104,
484: 3041929984,
485: 1436557312,
486: 2863174912,
487: 2862622720,
488: 3042221312,
489: 2874158848,
490: 1431315712,
491: 2863307264,
492: 1788882176,
493: 2874155264,
494: 1431901952,
495: 1431316992,
496: 1789763328,
497: 1453338880,
498: 2863670784,
499: 1431575552,
500: 3578801664,
501: 1453335296,
502: 2863798272,
503: 2862623488,
504: 3579191296,
505: 2907714048,
506: 1432365056,
507: 2863439104,
508: 2862624768,
509: 2907710464,
510: 1433082368,
511: 1431317760,
512: 2862621184,
513: 2907772416,
514: 2865768704,
515: 1431641856,
516: 3578802432,
517: 1520444928,
518: 2865994496,
519: 2862624256,
520: 3578798848,
521: 1521129472,
522: 1436560128,
523: 2863669248,
524: 1431377408,
525: 3041928960,
526: 1437441280,
527: 1432367104,
528: 2862621952,
529: 3042154752,
530: 2874158080,
531: 1432363520,
532: 2863240960,
533: 1788881152,
534: 2874547712,
535: 2865770752,
536: 1431316224,
537: 1789696768,
538: 1453338112,
539: 2865767168,
540: 1431476480,
541: 3578800640,
542: 1453334528,
543: 2865796352,
544: 2862622720,
545: 3579124736,
546: 2907713280,
547: 1436558592,
548: 2863372800,
549: 2862623744,
550: 2907709696,
551: 1437210368,
552: 1431316992,
553: 2863537664,
554: 1520447744,
555: 2874156544,
556: 1432099840,
557: 1431318016,
558: 1520444160,
559: 2874316800,
560: 2863672064,
561: 1431314432,
562: 1520997632,
563: 1453336576,
564: 2863963392,
565: 2863673088,
566: 1431315712,
567: 2863405568,
568: 1788882176,
569: 2874155264,
570: 1431967488,
571: 1431316992,
572: 1788878592,
573: 2874184448,
574: 2865767936,
575: 1431641088,
576: 3578801664,
577: 1453335296,
578: 2865960960,
579: 2865769216,
580: 1431314688,
581: 2863240448,
582: 1520445440,
583: 2866158848,
584: 1788882944,
585: 2907710464,
586: 1433147904,
587: 1431317760,
588: 1788879360,
589: 2907837952,
}
}
func weiZhouSuiEras() []Era {
return []Era{
{
Year: 601,
Emperor: "隋文帝",
Nianhao: "仁寿",
Dynasty: "隋",
},
{
Year: 581,
Emperor: "隋文帝",
Nianhao: "开皇",
Dynasty: "隋",
},
{
Year: 579,
Emperor: "北周静帝",
Nianhao: "大象",
Dynasty: "北周",
},
{
Year: 578,
Emperor: "北周宣帝",
OtherNianHaoStart: "宣政",
Dynasty: "北周",
},
{
Year: 572,
Emperor: "北周武帝",
OtherNianHaoStart: "建德",
Dynasty: "北周",
},
{
Year: 566,
Emperor: "北周武帝",
Nianhao: "天和",
Dynasty: "北周",
},
{
Year: 561,
Emperor: "北周武帝",
Nianhao: "保定",
Dynasty: "北周",
},
{
Year: 559,
Emperor: "北周明帝",
Nianhao: "武成",
Dynasty: "北周",
},
{
Year: 557,
Emperor: "北周明帝",
Nianhao: "北周明帝",
Dynasty: "北周",
},
{
Year: 554,
Emperor: "西魏恭帝",
Nianhao: "西魏恭帝",
Dynasty: "西魏",
},
{
Year: 552,
Emperor: "西魏元钦",
Nianhao: "西魏元钦",
Dynasty: "西魏",
},
{
Year: 535,
Emperor: "西魏文帝",
Nianhao: "大统",
Dynasty: "西魏",
},
{
Year: 532,
Emperor: "北魏孝武帝",
Nianhao: "永熙",
Dynasty: "北魏",
},
{
Year: 531,
Emperor: "北魏节闵帝",
OtherNianHaoStart: "中兴",
Dynasty: "北魏",
},
{
Year: 530,
Emperor: "北魏节闵帝",
OtherNianHaoStart: "建明",
Dynasty: "北魏",
},
{
Year: 528,
Emperor: "北魏孝庄帝",
OtherNianHaoStart: "武泰",
Dynasty: "北魏",
},
{
Year: 528,
Emperor: "北魏孝庄帝",
OtherNianHaoStart: "建义",
Dynasty: "北魏",
},
{
Year: 528,
Emperor: "北魏孝庄帝",
Nianhao: "永安",
Dynasty: "北魏",
},
{
Year: 525,
Emperor: "北魏孝明帝",
OtherNianHaoStart: "孝昌",
Dynasty: "北魏",
},
{
Year: 520,
Emperor: "北魏孝明帝",
OtherNianHaoStart: "正光",
Dynasty: "北魏",
},
{
Year: 518,
Emperor: "北魏孝明帝",
OtherNianHaoStart: "神龟",
Dynasty: "北魏",
},
{
Year: 516,
Emperor: "北魏孝明帝",
Nianhao: "熙平",
Dynasty: "北魏",
},
{
Year: 512,
Emperor: "北魏宣武帝",
OtherNianHaoStart: "延昌",
Dynasty: "北魏",
},
{
Year: 508,
Emperor: "北魏宣武帝",
OtherNianHaoStart: "永平",
Dynasty: "北魏",
},
{
Year: 504,
Emperor: "北魏宣武帝",
Nianhao: "正始",
Dynasty: "北魏",
},
{
Year: 500,
Emperor: "北魏宣武帝",
Nianhao: "景明",
Dynasty: "北魏",
},
{
Year: 477,
Emperor: "北魏孝文帝",
Nianhao: "太和",
Dynasty: "北魏",
},
{
Year: 476,
Emperor: "北魏孝文帝",
OtherNianHaoStart: "承明",
Dynasty: "北魏",
},
{
Year: 471,
Emperor: "北魏孝文帝",
OtherNianHaoStart: "延兴",
Dynasty: "北魏",
},
{
Year: 467,
Emperor: "北魏献文帝",
OtherNianHaoStart: "皇兴",
Dynasty: "北魏",
},
{
Year: 466,
Emperor: "北魏献文帝",
OtherNianHaoStart: "天安",
Dynasty: "北魏",
},
{
Year: 460,
Emperor: "北魏文成帝",
Nianhao: "和平",
Dynasty: "北魏",
},
{
Year: 455,
Emperor: "北魏文成帝",
OtherNianHaoStart: "太安",
Dynasty: "北魏",
},
{
Year: 454,
Emperor: "北魏文成帝",
OtherNianHaoStart: "兴光",
Dynasty: "北魏",
},
{
Year: 452,
Emperor: "北魏文成帝",
OtherNianHaoStart: "兴安",
Dynasty: "北魏",
},
{
Year: 451,
Emperor: "北魏太武帝",
OtherNianHaoStart: "正平",
Dynasty: "北魏",
},
{
Year: 440,
Emperor: "北魏太武帝",
OtherNianHaoStart: "太平真君",
Dynasty: "北魏",
},
{
Year: 435,
Emperor: "北魏太武帝",
Nianhao: "太延",
Dynasty: "北魏",
},
{
Year: 432,
Emperor: "北魏太武帝",
Nianhao: "延和",
Dynasty: "北魏",
},
{
Year: 428,
Emperor: "北魏太武帝",
OtherNianHaoStart: "神䴥",
Dynasty: "北魏",
},
{
Year: 424,
Emperor: "北魏太武帝",
Nianhao: "始光",
Dynasty: "北魏",
},
{
Year: 416,
Emperor: "北魏明元帝",
OtherNianHaoStart: "泰常",
Dynasty: "北魏",
},
{
Year: 414,
Emperor: "北魏明元帝",
Nianhao: "神瑞",
Dynasty: "北魏",
},
{
Year: 409,
Emperor: "北魏明元帝",
OtherNianHaoStart: "永兴",
Dynasty: "北魏",
},
{
Year: 404,
Emperor: "北魏道武帝",
OtherNianHaoStart: "天赐",
Dynasty: "北魏",
},
{
Year: 398,
Emperor: "北魏道武帝",
Nianhao: "天兴",
Dynasty: "北魏",
},
{
Year: 396,
Emperor: "北魏道武帝",
OtherNianHaoStart: "皇始",
Dynasty: "北魏",
},
{
Year: 386,
Emperor: "北魏道武帝",
Nianhao: "登国",
Dynasty: "北魏",
},
}
}
func weiZhouSuiEraMap() map[string][][]int {
return map[string][][]int{
//"开皇": [][]int{{581, 600}},
"大象": [][]int{{579, 580}},
"宣政": [][]int{{578, 578}},
"建德": [][]int{{572, 578}},
"天和": [][]int{{566, 572}},
"保定": [][]int{{561, 565}},
"武成": [][]int{{559, 560}},
"北周明帝": [][]int{{557, 558}},
"西魏恭帝": [][]int{{554, 556}},
"西魏元钦": [][]int{{552, 553}},
"大统": [][]int{{535, 551}},
"永熙": [][]int{{532, 534}},
"中兴": [][]int{{531, 531}},
"建明": [][]int{{530, 531}},
"永安": [][]int{{528, 530}},
"建义": [][]int{{528, 528}},
"武泰": [][]int{{528, 528}},
"孝昌": [][]int{{525, 527}},
"正光": [][]int{{520, 525}},
"神龟": [][]int{{518, 520}},
"熙平": [][]int{{516, 518}},
"延昌": [][]int{{512, 515}},
"永平": [][]int{{508, 512}},
"正始": [][]int{{504, 508}},
"景明": [][]int{{500, 503}},
"太和": [][]int{{477, 499}},
"承明": [][]int{{476, 476}},
"延兴": [][]int{{471, 476}},
"皇兴": [][]int{{467, 471}},
"天安": [][]int{{466, 467}},
"和平": [][]int{{460, 466}},
"太安": [][]int{{455, 459}},
"兴光": [][]int{{454, 455}},
"兴安": [][]int{{452, 454}},
"正平": [][]int{{451, 452}},
"太平真君": [][]int{{440, 451}},
"太延": [][]int{{435, 440}},
"延和": [][]int{{432, 434}},
"神䴥": [][]int{{428, 431}},
"始光": [][]int{{424, 428}},
"泰常": [][]int{{416, 423}},
"神瑞": [][]int{{414, 416}},
"永兴": [][]int{{409, 413}},
"天赐": [][]int{{404, 409}},
"天兴": [][]int{{398, 404}},
"皇始": [][]int{{396, 397}},
"登国": [][]int{{386, 396}},
}
}
func beiLiangCals() map[int]uint32 {
return map[int]uint32{
// currect here
412: 1432100352,
413: 1431318528,
414: 1520444672,
415: 2865928704,
416: 2863672576,
417: 1431314944,
418: 1521030912,
419: 1436559872,
420: 2864029440,
421: 2862625024,
422: 3041928704,
423: 1437309952,
424: 1432366848,
425: 2862621440,
426: 3042056192,
427: 2874157824,
428: 1432363264,
429: 2863174912,
430: 2862622720,
431: 2874449152,
432: 2865770496,
433: 1431315712,
434: 1789565440,
435: 1453337856,
436: 2865766912,
437: 1431377664,
438: 3578800384,
439: 1454219008,
}
}
func beiLiangEras() []Era {
return []Era{
{
Year: 433,
Emperor: "北凉哀王",
OtherNianHaoStart: "承和",
Dynasty: "北凉",
},
{
Year: 431,
Emperor: "北凉哀王",
OtherNianHaoStart: "义和",
Dynasty: "北凉",
},
{
Year: 428,
Emperor: "北凉哀王",
OtherNianHaoStart: "承玄",
Dynasty: "北凉",
},
{
Year: 412,
Emperor: "北凉武宣王",
OtherNianHaoStart: "玄始",
Dynasty: "北凉",
},
{
Year: 401,
Emperor: "北凉武宣王",
OtherNianHaoStart: "永安",
Dynasty: "北凉",
},
{
Year: 399,
Emperor: "北凉武宣王",
OtherNianHaoStart: "天玺",
Dynasty: "北凉",
},
{
Year: 397,
Emperor: "北凉武宣王",
Nianhao: "神玺",
Dynasty: "北凉",
},
}
}
func beiLiangEraMap() map[string][][]int {
return map[string][][]int{
"承和": [][]int{{433, 439}},
"义和": [][]int{{431, 433}},
"承玄": [][]int{{428, 431}},
"玄始": [][]int{{412, 428}},
"永安": [][]int{{401, 412}},
"天玺": [][]int{{399, 401}},
"神玺": [][]int{{397, 399}},
}
}
func dongWeiBeiQiCals() map[int]uint32 {
return map[int]uint32{
534: 2874547712,
535: 2865770752,
536: 1431316224,
537: 1789696768,
538: 1453338112,
539: 2865767168,
540: 1431476480,
541: 3578800640,
542: 1453334528,
543: 2865796352,
544: 2862622720,
545: 3579124736,
546: 2907713280,
547: 1436558592,
548: 2863372800,
549: 2862623744,
550: 2907709696,
551: 1432950528,
552: 1431316992,
553: 2863504896,
554: 1520447744,
555: 2865767936,
556: 1432099840,
557: 1431318016,
558: 1520444160,
559: 2865895424,
560: 2863672064,
561: 1431707648,
562: 3041931776,
563: 1436559360,
564: 2863963392,
565: 2862624512,
566: 3041928192,
567: 1437276672,
568: 1432366336,
569: 2862620928,
570: 3041990144,
571: 2874157312,
572: 1433247488,
573: 1431318784,
574: 1788880384,
575: 2874415872,
576: 2865769984,
577: 1431315200,
}
}
func dongWeiBeiQiEras() []Era {
return []Era{
{
Year: 577,
Emperor: "北齐后主",
Nianhao: "承光",
Dynasty: "北齐",
},
{
Year: 570,
Emperor: "北齐后主",
Nianhao: "武平",
Dynasty: "北齐",
},
{
Year: 565,
Emperor: "北齐后主",
OtherNianHaoStart: "天统",
Dynasty: "北齐",
},
{
Year: 562,
Emperor: "北齐武成帝",
OtherNianHaoStart: "河清",
Dynasty: "北齐",
},
{
Year: 561,
Emperor: "北齐武成帝",
OtherNianHaoStart: "太宁",
Dynasty: "北齐",
},
{
Year: 560,
Emperor: "北齐孝昭帝",
OtherNianHaoStart: "皇建",
Dynasty: "北齐",
},
{
Year: 550,
Emperor: "北齐文宣帝",
Nianhao: "天保",
Dynasty: "北齐",
},
{
Year: 543,
Emperor: "东魏孝静帝",
Nianhao: "武定",
Dynasty: "东魏",
},
{
Year: 539,
Emperor: "东魏孝静帝",
OtherNianHaoStart: "兴和",
Dynasty: "东魏",
},
{
Year: 538,
Emperor: "东魏孝静帝",
OtherNianHaoStart: "元象",
Dynasty: "东魏",
},
{
Year: 534,
Emperor: "东魏孝静帝",
Nianhao: "天平",
Dynasty: "东魏",
},
}
}
func dongWeiBeiQiEraMap() map[string][][]int {
return map[string][][]int{
"承光": [][]int{{577, 577}},
"武平": [][]int{{570, 576}},
"天统": [][]int{{565, 569}},
"河清": [][]int{{562, 565}},
"太宁": [][]int{{561, 562}},
"皇建": [][]int{{560, 561}},
"天保": [][]int{{550, 560}},
"武定": [][]int{{543, 549}},
"兴和": [][]int{{539, 542}},
"元象": [][]int{{538, 539}},
"天平": [][]int{{534, 538}},
}
}
func innerSolarToLunarNanBeiChao(date Time) Time {
year := date.solarTime.Year()
month := int(date.solarTime.Month())
day := date.solarTime.Day()
if year >= 384 && year <= 417 {
lyear, lmonth, ganzhiMonth, lday, isLeap, ldesc := rapidLunarHan2Qing(year, month, day, 0, houQinCals)
date.lunars = append(date.lunars, LunarTime{
year: lyear,
month: lmonth,
day: lday,
leap: isLeap,
desc: ldesc,
comment: "",
ganzhiMonth: ganzhiMonth,
eras: innerEras(lyear, houQinEras),
})
}
if year >= 398 && year <= 589 {
lyear, lmonth, ganzhiMonth, lday, isLeap, ldesc := rapidLunarHan2Qing(year, month, day, 0, weiZhouSuiCals)
date.lunars = append(date.lunars, LunarTime{
year: lyear,
month: lmonth,
day: lday,
leap: isLeap,
desc: ldesc,
comment: "",
ganzhiMonth: ganzhiMonth,
eras: innerEras(lyear, weiZhouSuiEras),
})
}
if year >= 397 && year <= 439 {
lyear, lmonth, ganzhiMonth, lday, isLeap, ldesc := rapidLunarHan2Qing(year, month, day, 0, beiLiangCals)
date.lunars = append(date.lunars, LunarTime{
year: lyear,
month: lmonth,
day: lday,
leap: isLeap,
ganzhiMonth: ganzhiMonth,
desc: ldesc,
comment: "",
eras: innerEras(lyear, beiLiangEras),
})
}
if year >= 534 && year <= 577 {
lyear, lmonth, ganzhiMonth, lday, isLeap, ldesc := rapidLunarHan2Qing(year, month, day, 0, dongWeiBeiQiCals)
date.lunars = append(date.lunars, LunarTime{
year: lyear,
month: lmonth,
day: lday,
leap: isLeap,
desc: ldesc,
ganzhiMonth: ganzhiMonth,
comment: "",
eras: innerEras(lyear, dongWeiBeiQiEras),
})
}
return date
}
+126
View File
@@ -0,0 +1,126 @@
package calendar
func nanMingCals() map[int]uint32 {
return map[int]uint32{
1645: 1232804864,
1646: 1232088832,
1647: 1689265152,
1648: 1783732480,
1649: 3662686720,
1650: 1800249344,
1651: 1456485120,
1652: 719333632,
1653: 2465438976,
1654: 2464165888,
1655: 3378521344,
1656: 3567950336,
1657: 3567266816,
1658: 3662684416,
1659: 1520998144,
1660: 1453337088,
1661: 2799508992,
1662: 634401280,
1663: 2463115008,
1664: 2841320448,
1665: 2840604160,
1666: 3030393600,
1667: 3042056192,
1668: 2907712256,
1669: 1437474816,
1670: 1269838592,
1671: 632301824,
1672: 1388060160,
1673: 1387278336,
1674: 1689265408,
1675: 1957370368,
1676: 1788882176,
1677: 2907709696,
1678: 1302927104,
1679: 1264593408,
1680: 2775916288,
1681: 2766156032,
1682: 3529516544,
1683: 3912440576,
}
}
func nanMingEras01() []Era {
return []Era{
{
Year: 1646,
Emperor: "南明鲁王",
OtherNianHaoStart: "鲁王监国",
Dynasty: "南明",
},
{
Year: 1645,
Emperor: "南明隆武帝",
OtherNianHaoStart: "隆武",
Dynasty: "南明",
}, {
Year: 1645,
Emperor: "南明弘光帝",
Nianhao: "弘光",
Dynasty: "南明",
},
{
Year: 1628,
Emperor: "明思宗",
Nianhao: "崇祯",
Dynasty: "明",
},
}
}
func nanMingEras02() []Era {
return []Era{
{
Year: 1647,
Emperor: "南明/明郑",
OtherNianHaoStart: "永历",
Dynasty: "南明",
},
}
}
func nanMingEraMap() map[string][][]int {
return map[string][][]int{
"永历": [][]int{{1647, 1683}},
"鲁王监国": [][]int{{1646, 1653}},
"隆武": [][]int{{1645, 1646}},
"弘光": [][]int{{1645, 1645}},
}
}
func innerSolarToLunarNanMing(date Time) Time {
year := date.solarTime.Year()
month := int(date.solarTime.Month())
day := date.solarTime.Day()
if year > 1644 && year < 1654 {
lyear, lmonth, ganzhiMonth, lday, isLeap, ldesc := rapidLunarHan2Qing(year, month, day, 0, nanMingCals)
date.lunars = append(date.lunars, LunarTime{
year: lyear,
month: lmonth,
day: lday,
leap: isLeap,
desc: ldesc,
ganzhiMonth: ganzhiMonth,
comment: "",
eras: innerEras(lyear, nanMingEras01),
})
}
if year > 1646 && year < 1684 {
lyear, lmonth, ganzhiMonth, lday, isLeap, ldesc := rapidLunarHan2Qing(year, month, day, 0, nanMingCals)
date.lunars = append(date.lunars, LunarTime{
year: lyear,
month: lmonth,
day: lday,
leap: isLeap,
desc: ldesc,
ganzhiMonth: ganzhiMonth,
comment: "",
eras: innerEras(lyear, nanMingEras02),
})
}
return date
}
+305
View File
@@ -0,0 +1,305 @@
package calendar
// 蜀汉朔日表
func shuCals() map[int]uint32 {
return map[int]uint32{
237: 2862623744,
238: 3042255104,
239: 2874160128,
240: 1432365568,
241: 2863373824,
242: 1788883200,
243: 2907710976,
244: 1432984576,
245: 1431318016,
246: 1789764352,
247: 1520449024,
248: 2865769216,
249: 1432100864,
250: 1431319296,
251: 1520445440,
252: 2865929472,
253: 2863673088,
254: 1431315712,
255: 1520998912,
256: 1453337856,
257: 2863964416,
258: 2862625792,
259: 3041929472,
260: 1454087936,
261: 1432367360,
262: 2862622208,
263: 3578927872,
}
}
func shuEras() []Era {
return []Era{
{
Year: 264,
Emperor: "魏元帝",
OtherNianHaoStart: "咸熙",
},
{
Year: 263,
Emperor: "蜀后主",
OtherNianHaoStart: "炎兴",
},
{
Year: 258,
Emperor: "蜀后主",
Nianhao: "景耀",
},
{
Year: 238,
Emperor: "蜀后主",
Nianhao: "延熙",
},
{
Year: 223,
Emperor: "蜀后主",
OtherNianHaoStart: "建兴",
},
{
Year: 221,
Emperor: "蜀昭烈帝",
Nianhao: "章武",
},
}
}
func shuEraMap() map[string][][]int {
return map[string][][]int{
"炎兴": [][]int{{263, 263}},
"景耀": [][]int{{258, 263}},
"延熙": [][]int{{238, 257}},
"建兴": [][]int{{223, 237}},
"章武": [][]int{{221, 223}},
}
}
func wuCals() map[int]uint32 {
return map[int]uint32{
223: 1432367360,
224: 2862622208,
225: 3578927616,
226: 2907712768,
227: 1433281280,
228: 1431320064,
229: 1788881408,
230: 2907971328,
231: 2865771008,
232: 1431316480,
233: 1789565952,
234: 1520447232,
235: 2865767424,
236: 1431378432,
237: 3578800896,
238: 1521295616,
239: 1436562432,
240: 2862622976,
241: 3578993920,
242: 3041931264,
243: 1436558848,
244: 2863766272,
245: 2862624000,
246: 3042320896,
247: 2865771776,
248: 1431317248,
249: 2863406848,
250: 1788883456,
251: 2874156800,
252: 1431969024,
253: 1431318272,
254: 1520444416,
255: 2874185984,
256: 2863672320,
257: 1431642368,
258: 3041932032,
259: 1453336832,
260: 2863898112,
261: 2862624768,
262: 3041928448,
263: 1453955840,
264: 1432366592,
265: 2863505920,
266: 1788884224,
267: 2907712000,
268: 1433149440,
269: 1431319040,
270: 1788880640,
271: 2907872256,
272: 2865770240,
273: 1431315456,
274: 1789434112,
275: 1453337600,
276: 2866094336,
277: 2862625536,
278: 3578800128,
279: 1454087680,
280: 1436561664,
}
}
func wuEraMap() map[string][][]int {
return map[string][][]int{
"天玺": [][]int{{276, 276}},
"天册": [][]int{{275, 276}},
"凤凰": [][]int{{272, 275}},
"建衡": [][]int{{269, 271}},
"宝鼎": [][]int{{266, 269}},
"甘露": [][]int{{265, 266}},
"元兴": [][]int{{264, 265}},
"永安": [][]int{{258, 264}},
"太平": [][]int{{256, 258}},
"五凤": [][]int{{254, 256}},
"建兴": [][]int{{252, 253}},
"太元": [][]int{{251, 252}},
"赤乌": [][]int{{238, 251}},
"嘉禾": [][]int{{232, 238}},
"黄龙": [][]int{{229, 231}},
"黄武": [][]int{{222, 229}},
}
}
func wuEras() []Era {
return []Era{
{
Year: 277,
Emperor: "吴末帝",
Nianhao: "天纪",
Dynasty: "吴",
},
{
Year: 276,
Emperor: "吴末帝",
OtherNianHaoStart: "天玺",
Dynasty: "吴",
},
{
Year: 275,
Emperor: "吴末帝",
OtherNianHaoStart: "天册",
Dynasty: "吴",
},
{
Year: 272,
Emperor: "吴末帝",
Nianhao: "凤凰",
Dynasty: "吴",
},
{
Year: 269,
Emperor: "吴末帝",
OtherNianHaoStart: "建衡",
Dynasty: "吴",
},
{
Year: 266,
Emperor: "吴末帝",
OtherNianHaoStart: "宝鼎",
Dynasty: "吴",
},
{
Year: 265,
Emperor: "吴末帝",
OtherNianHaoStart: "甘露",
Dynasty: "吴",
},
{
Year: 264,
Emperor: "吴末帝",
OtherNianHaoStart: "元兴",
Dynasty: "吴",
},
{
Year: 258,
Emperor: "吴景帝",
OtherNianHaoStart: "永安",
Dynasty: "吴",
},
{
Year: 256,
Emperor: "吴景帝",
OtherNianHaoStart: "太平",
Dynasty: "吴",
},
{
Year: 254,
Emperor: "吴景帝",
Nianhao: "五凤",
Dynasty: "吴",
},
{
Year: 252,
Emperor: "吴景帝",
OtherNianHaoStart: "建兴",
Dynasty: "吴",
},
{
Year: 251,
Emperor: "吴大帝",
OtherNianHaoStart: "太元",
Dynasty: "吴",
},
{
Year: 238,
Emperor: "吴大帝",
OtherNianHaoStart: "赤乌",
Dynasty: "吴",
},
{
Year: 232,
Emperor: "吴大帝",
Nianhao: "嘉禾",
Dynasty: "吴",
},
{
Year: 229,
Emperor: "吴大帝",
OtherNianHaoStart: "黄龙",
Dynasty: "吴",
},
{
Year: 222,
Emperor: "吴大帝",
Nianhao: "黄武",
Dynasty: "吴",
},
}
}
func innerSolarToLunarSanGuo(date Time) Time {
year := date.solarTime.Year()
month := int(date.solarTime.Month())
day := date.solarTime.Day()
if year >= 221 && year <= 263 {
lyear, lmonth, ganzhiMonth, lday, isLeap, ldesc := rapidLunarHan2Qing(year, month, day, 0, shuCals)
date.lunars = append(date.lunars, LunarTime{
solarDate: date.solarTime,
year: lyear,
month: lmonth,
day: lday,
leap: isLeap,
desc: ldesc,
comment: "",
ganzhiMonth: ganzhiMonth,
eras: innerEras(lyear, shuEras),
})
}
if year >= 222 && year <= 280 {
lyear, lmonth, ganzhiMonth, lday, isLeap, ldesc := rapidLunarHan2Qing(year, month, day, 0, wuCals)
date.lunars = append(date.lunars, LunarTime{
solarDate: date.solarTime,
year: lyear,
month: lmonth,
day: lday,
leap: isLeap,
desc: ldesc,
ganzhiMonth: ganzhiMonth,
comment: "",
eras: innerEras(lyear, wuEras),
})
}
return date
}
+221 -20
View File
@@ -7,16 +7,20 @@ import (
)
type lunarSolar struct {
Lyear int
Lmonth int
Lday int
Leap bool
Year int
Month int
Day int
Lyear int
Lmonth int
Lday int
Leap bool
Year int
Month int
Day int
Desc string
GanZhiYear string
GanZhiMonth string
GanZhiDay string
}
func Test_ChineseCalendar(t *testing.T) {
func Test_ChineseCalendarModern(t *testing.T) {
var testData = []lunarSolar{
{Lyear: 1995, Lmonth: 12, Lday: 12, Leap: false, Year: 1996, Month: 1, Day: 31},
{Lyear: 2034, Lmonth: 1, Lday: 1, Leap: false, Year: 2034, Month: 2, Day: 19},
@@ -40,7 +44,7 @@ func Test_ChineseCalendar(t *testing.T) {
for _, v := range testData {
{
var lyear int = v.Year
lmonth, lday, leap, desp := SolarToLunar(time.Date(v.Year, time.Month(v.Month), v.Day, 0, 0, 0, 0, time.Local))
_, lmonth, lday, leap, desp := Lunar(v.Year, v.Month, v.Day, 8.0)
if lmonth > v.Month {
lyear--
}
@@ -49,26 +53,223 @@ func Test_ChineseCalendar(t *testing.T) {
t.Fatal(v, lyear, lmonth, lday, leap, desp)
}
date := LunarToSolar(v.Lyear, v.Lmonth, v.Lday, v.Leap)
date := Solar(v.Lyear, v.Lmonth, v.Lday, v.Leap, 8.0)
if date.Year() != v.Year || int(date.Month()) != v.Month || date.Day() != v.Day {
t.Fatal(v, date)
}
}
{
var lyear int = v.Year
lmonth, lday, leap, desp := RapidSolarToLunar(time.Date(v.Year, time.Month(v.Month), v.Day, 0, 0, 0, 0, time.Local))
if lmonth > v.Month {
lyear--
/*
{
var lyear int = v.Year
lmonth, lday, leap, desp := RapidSolarToLunar(time.Date(v.Year, time.Month(v.Month), v.Day, 0, 0, 0, 0, time.Local))
if lmonth > v.Month {
lyear--
}
fmt.Println(lyear, desp, v.Year, v.Month, v.Day)
if lyear != v.Lyear || lmonth != v.Lmonth || lday != v.Lday || leap != v.Leap {
t.Fatal(v, lyear, lmonth, lday, leap, desp)
}
date := RapidLunarToSolar(v.Lyear, v.Lmonth, v.Lday, v.Leap)
if date.Year() != v.Year || int(date.Month()) != v.Month || date.Day() != v.Day {
t.Fatal(v, date)
}
}
fmt.Println(lyear, desp, v.Year, v.Month, v.Day)
if lyear != v.Lyear || lmonth != v.Lmonth || lday != v.Lday || leap != v.Leap {
t.Fatal(v, lyear, lmonth, lday, leap, desp)
*/
}
}
func Test_ChineseCalendarModern2(t *testing.T) {
var testData = []lunarSolar{
{Lyear: 1995, Lmonth: 12, Lday: 12, Leap: false, Year: 1996, Month: 1, Day: 31},
{Lyear: 2034, Lmonth: 1, Lday: 1, Leap: false, Year: 2034, Month: 2, Day: 19},
{Lyear: 2033, Lmonth: 12, Lday: 30, Leap: false, Year: 2034, Month: 2, Day: 18},
{Lyear: 2033, Lmonth: 11, Lday: 27, Leap: true, Year: 2034, Month: 1, Day: 17},
{Lyear: 2033, Lmonth: 11, Lday: 1, Leap: true, Year: 2033, Month: 12, Day: 22},
{Lyear: 2033, Lmonth: 11, Lday: 30, Leap: false, Year: 2033, Month: 12, Day: 21},
{Lyear: 2023, Lmonth: 2, Lday: 30, Leap: false, Year: 2023, Month: 3, Day: 21},
{Lyear: 2023, Lmonth: 2, Lday: 1, Leap: true, Year: 2023, Month: 3, Day: 22},
{Lyear: 2020, Lmonth: 1, Lday: 1, Leap: false, Year: 2020, Month: 1, Day: 25},
{Lyear: 2015, Lmonth: 1, Lday: 1, Leap: false, Year: 2015, Month: 2, Day: 19},
{Lyear: 2014, Lmonth: 12, Lday: 30, Leap: false, Year: 2015, Month: 2, Day: 18},
{Lyear: 1996, Lmonth: 1, Lday: 1, Leap: false, Year: 1996, Month: 2, Day: 19},
{Lyear: 1995, Lmonth: 12, Lday: 30, Leap: false, Year: 1996, Month: 2, Day: 18},
{Lyear: 1996, Lmonth: 10, Lday: 30, Leap: false, Year: 1996, Month: 12, Day: 10},
{Lyear: 2014, Lmonth: 9, Lday: 1, Leap: true, Year: 2014, Month: 10, Day: 24},
{Lyear: 2014, Lmonth: 9, Lday: 30, Leap: false, Year: 2014, Month: 10, Day: 23},
{Lyear: 2014, Lmonth: 10, Lday: 1, Leap: false, Year: 2014, Month: 11, Day: 22},
{Lyear: 2021, Lmonth: 12, Lday: 29, Leap: false, Year: 2022, Month: 1, Day: 31},
}
for _, v := range testData {
{
res, err := SolarToLunar(time.Date(v.Year, time.Month(v.Month), v.Day, 0, 0, 0, 0, time.Local))
if err != nil {
t.Fatal(err)
}
if len(res.Lunars()) != 1 {
t.Fatal("len(res.Lunars())!=1")
}
lunar := res.Lunars()[0]
if lunar.year != v.Lyear || lunar.month != v.Lmonth || lunar.day != v.Lday || lunar.leap != v.Leap {
t.Fatal(v, lunar.year, lunar.month, lunar.day, lunar.leap)
}
date := RapidLunarToSolar(v.Lyear, v.Lmonth, v.Lday, v.Leap)
if date.Year() != v.Year || int(date.Month()) != v.Month || date.Day() != v.Day {
date, err := LunarToSolarSingle(v.Lyear, v.Lmonth, v.Lday, v.Leap)
if err != nil {
t.Fatal(err)
}
solar := date.Time()
if solar.Year() != v.Year || int(solar.Month()) != v.Month || solar.Day() != v.Day {
t.Fatal(v, date)
}
}
/*
{
var lyear int = v.Year
lmonth, lday, leap, desp := RapidSolarToLunar(time.Date(v.Year, time.Month(v.Month), v.Day, 0, 0, 0, 0, time.Local))
if lmonth > v.Month {
lyear--
}
fmt.Println(lyear, desp, v.Year, v.Month, v.Day)
if lyear != v.Lyear || lmonth != v.Lmonth || lday != v.Lday || leap != v.Leap {
t.Fatal(v, lyear, lmonth, lday, leap, desp)
}
date := RapidLunarToSolar(v.Lyear, v.Lmonth, v.Lday, v.Leap)
if date.Year() != v.Year || int(date.Month()) != v.Month || date.Day() != v.Day {
t.Fatal(v, date)
}
}
*/
}
}
func Test_ChineseCalendarAncient(t *testing.T) {
var testData = []lunarSolar{
{Lyear: -103, Lmonth: 1, Lday: 1, Leap: false, Year: -103, Month: 2, Day: 22, Desc: "太初元年正月初一", GanZhiYear: "丁丑", GanZhiMonth: "壬寅", GanZhiDay: "癸亥"},
{Lyear: -101, Lmonth: 6, Lday: 2, Leap: true, Year: -101, Month: 7, Day: 28, Desc: "太初三年闰六月初二", GanZhiYear: "己卯", GanZhiMonth: "辛未", GanZhiDay: "己酉"},
{Lyear: 8, Lmonth: 11, Lday: 29, Leap: false, Year: 9, Month: 1, Day: 14, Desc: "初始元年冬月廿九", GanZhiYear: "戊辰", GanZhiMonth: "甲子", GanZhiDay: "壬申"},
//王莽改制
{Lyear: 9, Lmonth: 1, Lday: 1, Leap: false, Year: 9, Month: 1, Day: 15, Desc: "始建国元年正月初一", GanZhiYear: "己巳", GanZhiMonth: "乙丑", GanZhiDay: "癸酉"},
{Lyear: 23, Lmonth: 1, Lday: 1, Leap: false, Year: 23, Month: 1, Day: 11, Desc: "地皇四年正月初一", GanZhiYear: "癸未", GanZhiMonth: "癸丑", GanZhiDay: "壬午"},
{Lyear: 23, Lmonth: 2, Lday: 1, Leap: false, Year: 23, Month: 2, Day: 10, Desc: "地皇四年二月初一", GanZhiYear: "癸未", GanZhiMonth: "甲寅", GanZhiDay: "壬子"},
//改回来了
{Lyear: 23, Lmonth: 1, Lday: 1, Leap: false, Year: 23, Month: 2, Day: 10, Desc: "更始元年正月初一", GanZhiYear: "癸未", GanZhiMonth: "甲寅", GanZhiDay: "壬子"},
{Lyear: 23, Lmonth: 12, Lday: 1, Leap: false, Year: 23, Month: 12, Day: 31, Desc: "更始元年腊月初一", GanZhiYear: "癸未", GanZhiMonth: "乙丑", GanZhiDay: "丙子"},
{Lyear: 24, Lmonth: 1, Lday: 1, Leap: false, Year: 24, Month: 1, Day: 30, Desc: "更始二年正月初一", GanZhiYear: "甲申", GanZhiMonth: "丙寅", GanZhiDay: "丙午"},
{Lyear: 97, Lmonth: 8, Lday: 5, Leap: true, Year: 97, Month: 9, Day: 29, Desc: "永元九年闰八月初五", GanZhiYear: "丁酉", GanZhiMonth: "己酉", GanZhiDay: "壬申"},
{Lyear: 100, Lmonth: 2, Lday: 1, Leap: false, Year: 100, Month: 2, Day: 28, Desc: "永元十二年二月初一", GanZhiYear: "庚子", GanZhiMonth: "己卯", GanZhiDay: "甲寅"},
//按照儒略历,这一天有29号
{Lyear: 100, Lmonth: 2, Lday: 3, Leap: false, Year: 100, Month: 3, Day: 1, Desc: "永元十二年二月初三", GanZhiYear: "庚子", GanZhiMonth: "己卯", GanZhiDay: "丙辰"},
//三国演义
{Lyear: 190, Lmonth: 1, Lday: 1, Leap: false, Year: 190, Month: 2, Day: 23, Desc: "初平元年正月初一", GanZhiYear: "庚午", GanZhiMonth: "戊寅", GanZhiDay: "壬寅"},
{Lyear: 220, Lmonth: 5, Lday: 5, Leap: false, Year: 220, Month: 6, Day: 23, Desc: "黄初元年五月初五", GanZhiYear: "庚子", GanZhiMonth: "壬午", GanZhiDay: "庚辰"},
{Lyear: 220, Lmonth: 5, Lday: 5, Leap: false, Year: 220, Month: 6, Day: 23, Desc: "建安二十五年五月初五", GanZhiYear: "庚子", GanZhiMonth: "壬午", GanZhiDay: "庚辰"},
{Lyear: 220, Lmonth: 5, Lday: 5, Leap: false, Year: 220, Month: 6, Day: 23, Desc: "延康元年五月初五", GanZhiYear: "庚子", GanZhiMonth: "壬午", GanZhiDay: "庚辰"},
{Lyear: 246, Lmonth: 12, Lday: 2, Leap: true, Year: 247, Month: 1, Day: 25, Desc: "正始七年闰腊月初二", GanZhiYear: "丙寅", GanZhiMonth: "辛丑", GanZhiDay: "壬申"},
{Lyear: 246, Lmonth: 12, Lday: 2, Leap: false, Year: 247, Month: 1, Day: 25, Desc: "延熙九年腊月初二", GanZhiYear: "丙寅", GanZhiMonth: "辛丑", GanZhiDay: "壬申"},
{Lyear: 237, Lmonth: 2, Lday: 29, Leap: false, Year: 237, Month: 4, Day: 11, Desc: "景初元年二月廿九", GanZhiYear: "丁巳", GanZhiMonth: "癸卯", GanZhiDay: "丙申"},
{Lyear: 237, Lmonth: 4, Lday: 1, Leap: false, Year: 237, Month: 4, Day: 12, Desc: "景初元年四月初一", GanZhiYear: "丁巳", GanZhiMonth: "甲辰", GanZhiDay: "丁酉"},
{Lyear: 237, Lmonth: 2, Lday: 29, Leap: false, Year: 237, Month: 4, Day: 12, Desc: "建兴十五年二月廿九", GanZhiYear: "丁巳", GanZhiMonth: "癸卯", GanZhiDay: "丁酉"},
{Lyear: 237, Lmonth: 2, Lday: 30, Leap: false, Year: 237, Month: 4, Day: 12, Desc: "嘉禾六年二月三十", GanZhiYear: "丁巳", GanZhiMonth: "癸卯", GanZhiDay: "丁酉"},
//魏明帝改制,导致景初三年有两个12月
{Lyear: 239, Lmonth: 12, Lday: 1, Leap: false, Year: 239, Month: 12, Day: 13, Desc: "景初三年腊月初一", GanZhiYear: "己未", GanZhiMonth: "丙子", GanZhiDay: "壬子"},
{Lyear: 239, Lmonth: 12, Lday: 1, Leap: false, Year: 240, Month: 1, Day: 12, Desc: "景初三年腊月初一", GanZhiYear: "己未", GanZhiMonth: "丁丑", GanZhiDay: "壬午"},
//武则天改制,建子为正月,但是其他月份不变,所以正月不是一月,一月相当于三月,以此类推
{Lyear: 690, Lmonth: 1, Lday: 1, Leap: false, Year: 689, Month: 12, Day: 18, Desc: "天授元年正月初一", GanZhiYear: "庚寅", GanZhiMonth: "丙子", GanZhiDay: "庚辰"},
{Lyear: 690, Lmonth: 1, Lday: 1, Leap: false, Year: 689, Month: 12, Day: 18, Desc: "载初元年正月初一", GanZhiYear: "庚寅", GanZhiMonth: "丙子", GanZhiDay: "庚辰"},
// 太抽象了,一月是一月,正月是正月。一月!=正月
{Lyear: 690, Lmonth: 3, Lday: 1, Leap: false, Year: 690, Month: 2, Day: 15, Desc: "天授元年一月初一", GanZhiYear: "庚寅", GanZhiMonth: "戊寅", GanZhiDay: "己卯"},
{Lyear: 700, Lmonth: 2, Lday: 6, Leap: false, Year: 700, Month: 1, Day: 1, Desc: "圣历三年腊月初六", GanZhiYear: "庚子", GanZhiMonth: "丁丑", GanZhiDay: "丙戌"},
{Lyear: 700, Lmonth: 12, Lday: 6, Leap: false, Year: 701, Month: 1, Day: 19, Desc: "圣历三年腊月初六", GanZhiYear: "庚子", GanZhiMonth: "己丑", GanZhiDay: "庚戌"},
{Lyear: 700, Lmonth: 11, Lday: 1, Leap: false, Year: 700, Month: 12, Day: 15, Desc: "圣历三年冬月初一", GanZhiYear: "庚子", GanZhiMonth: "戊子", GanZhiDay: "乙亥"},
//格里高利历改革
{Lyear: 1582, Lmonth: 9, Lday: 18, Leap: false, Year: 1582, Month: 10, Day: 4, Desc: "万历十年九月十八", GanZhiYear: "壬午", GanZhiMonth: "庚戌", GanZhiDay: "癸酉"},
{Lyear: 1582, Lmonth: 9, Lday: 19, Leap: false, Year: 1582, Month: 10, Day: 15, Desc: "万历十年九月十九", GanZhiYear: "壬午", GanZhiMonth: "庚戌", GanZhiDay: "甲戌"},
{Lyear: 1631, Lmonth: 11, Lday: 10, Leap: true, Year: 1632, Month: 1, Day: 1, Desc: "崇祯四年闰冬月初十", GanZhiYear: "辛未", GanZhiMonth: "庚子", GanZhiDay: "己酉"},
{Lyear: 1912, Lmonth: 11, Lday: 24, Leap: false, Year: 1913, Month: 1, Day: 1, Desc: "一九一二年冬月廿四", GanZhiYear: "壬子", GanZhiMonth: "壬子", GanZhiDay: "壬午"},
}
for _, v := range testData {
{
dates, err := SolarToLunar(time.Date(v.Year, time.Month(v.Month), v.Day, 0, 0, 0, 0, time.Local))
if err != nil {
t.Fatal(err)
}
succ := false
for _, date := range dates.Lunars() {
for _, v2 := range date.LunarDesc() {
if v2 == v.Desc {
succ = true
if date.LunarYear() != v.Lyear || date.LunarMonth() != v.Lmonth || date.LunarDay() != v.Lday || date.IsLeap() != v.Leap {
t.Fatal(v, date.LunarYear(), date.LunarMonth(), date.LunarDay(), date.IsLeap())
}
if date.solarDate.IsZero() {
t.Fatal(v, "zero")
}
if date.GanZhiYear() != v.GanZhiYear || date.GanZhiMonth() != v.GanZhiMonth || date.GanZhiDay() != v.GanZhiDay {
t.Fatal(v, date.GanZhiYear(), date.GanZhiMonth(), date.GanZhiDay())
}
break
}
}
}
if !succ {
t.Fatal("not found", v, dates.LunarDesc(), dates.LunarInfo())
}
}
{
dates, err := LunarToSolar(v.Desc)
if err != nil {
t.Fatal(err)
}
succ := false
for _, date := range dates {
solar := date.Solar()
if solar.Year() == v.Year && int(solar.Month()) == v.Month && solar.Day() == v.Day {
succ = true
break
}
}
if !succ {
t.Fatal("not found", v, dates)
}
}
}
}
func TestGanZhiOfDay(t *testing.T) {
dates := time.Date(23, 12, 31, 0, 0, 0, 0, time.Local)
fmt.Println(SolarToLunar(dates))
//date, err := LunarToSolar("久视元年腊月辛亥")
date, err := LunarToSolar("万历十年九月甲戌")
if err != nil {
t.Fatal(err)
}
for _, v := range date {
fmt.Println(v.solarTime)
fmt.Println(v.LunarDescWithDynastyAndEmperor())
}
}
/*
func TestgenReverseMapNianHao(t *testing.T) {
//mymap := make(map[string][][]int)
eras := nanMingEras01()
for idx, v := range eras {
if idx == 0 {
continue
}
end := (eras[idx-1].Year - eras[idx-1].Offset) - 1
if eras[idx-1].OtherNianHaoStart != "" {
end++
}
niaohao := v.Nianhao
if v.OtherNianHaoStart != "" {
niaohao = v.OtherNianHaoStart
}
fmt.Printf("\"%s\":[][]int{{%d,%d}},\n", niaohao, v.Year-v.Offset, end)
}
}
*/
+2477
View File
File diff suppressed because it is too large Load Diff
+299
View File
@@ -0,0 +1,299 @@
package calendar
import (
"time"
)
type LunarInfo struct {
// SolarDate 公历日期
SolarDate time.Time `json:"solarDate"`
// LunarYear 农历年的公历映射,如2025
LunarYear int `json:"lunarYear"`
// LunarYearChn 农历年公历映射中文表示,比如二零二五
LunarYearChn string `json:"lunarYearChn"`
// LunarMonth 农历月,表示以当时的历法推定的农历月与正月的距离,正月为1,二月为2,依次类推
// 武则天改历时期,正月为1, 十二月为2,一月为3,二月为4,以此类推
LunarMonth int `json:"lunarMonth"`
// LunarDay 农历日,[1-30]
LunarDay int `json:"lunarDay"`
// IsLeap 是否闰月
IsLeap bool `json:"isLeap"`
// LunarMonthDayDesc 农历月日描述,如正月初一。此处,十一月表示为冬月,十二月表示为腊月
LunarMonthDayDesc string `json:"lunarMonthDayDesc"`
// GanzhiYear 农历年干支
GanzhiYear string `json:"ganzhiYear"`
// GanzhiMonth 农历月干支,闰月从上一个月
GanzhiMonth string `json:"ganzhiMonth"`
// GanzhiDay 农历日干支
GanzhiDay string `json:"ganzhiDay"`
// Dynasty 朝代,如唐、宋、元、明、清等
Dynasty string `json:"dynasty"`
// Emperor 皇帝姓名(仅供参考,多个皇帝用同一个年号的场景,此处不准)
Emperor string `json:"emperor"`
// Nianhao 年号 如"开元"
Nianhao string `json:"nianhao"`
// YearOfNianhao 该年号的第几年
YearOfNianhao int `json:"yearOfNianhao"`
// EraDesc 年代描述,如唐玄宗开元二年
EraDesc string `json:"eraDesc"`
// LunarWithEraDesc 农历日期加上年代描述,如开元二年正月初一
LunarWithEraDesc string `json:"lunarWithNianhaoDesc"`
// ChineseZodiac 生肖
ChineseZodiac string `json:"chineseZodiac"`
}
type Time struct {
solarTime time.Time
lunars []LunarTime
}
func (t Time) Solar() time.Time {
return t.solarTime
}
func (t Time) Time() time.Time {
return t.solarTime
}
func (t Time) Lunars() []LunarTime {
return t.lunars
}
func (t Time) LunarDesc() []string {
var res []string
for _, v := range t.lunars {
res = append(res, v.LunarDesc()...)
}
return res
}
func (t Time) LunarDescWithEmperor() []string {
var res []string
for _, v := range t.lunars {
res = append(res, v.LunarDescWithEmperor()...)
}
return res
}
func (t Time) LunarDescWithDynasty() []string {
var res []string
for _, v := range t.lunars {
res = append(res, v.LunarDescWithDynasty()...)
}
return res
}
func (t Time) LunarDescWithDynastyAndEmperor() []string {
var res []string
for _, v := range t.lunars {
res = append(res, v.LunarDescWithDynastyAndEmperor()...)
}
return res
}
func (t Time) LunarInfo() []LunarInfo {
var res []LunarInfo
for _, v := range t.lunars {
res = append(res, v.LunarInfo()...)
}
return res
}
func (t Time) Eras() []EraDesc {
var res []EraDesc
for _, v := range t.lunars {
res = append(res, v.eras...)
}
return res
}
func (t Time) Lunar() LunarTime {
if len(t.lunars) > 0 {
return t.lunars[0]
}
return LunarTime{}
}
func (t Time) Add(d time.Duration) Time {
if d < time.Second {
newT := t.solarTime.Add(d)
rT, _ := SolarToLunar(newT)
return rT
}
sec := d.Seconds()
jde := Date2JDE(t.solarTime)
jde += sec / 86400.0
newT := JDE2Date(jde)
rT, _ := SolarToLunar(newT)
return rT
}
type LunarTime struct {
solarDate time.Time
//农历年
year int
//农历月,表示以当时的历法推定的农历月与正月的距离,正月为1,二月为2,依次类推,闰月显示所闰月
month int
//农历日
day int
//是否闰月
leap bool
//农历描述
desc string
//备注
comment string
//ganzhi of month 月干支
ganzhiMonth string
eras []EraDesc
}
// ShengXiao 生肖
func (l LunarTime) ShengXiao() string {
shengxiao := []string{"猴", "鸡", "狗", "猪", "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊"}
diff := l.LunarYear() % 12
if diff < 0 {
diff += 12
}
return shengxiao[diff]
}
// Zodiac 生肖,和生肖同义
func (l LunarTime) Zodiac() string {
return l.ShengXiao()
}
// GanZhiYear 年干支
func (l LunarTime) GanZhiYear() string {
return GanZhiOfYear(l.year)
}
// GanZhiMonth 月干支
func (l LunarTime) GanZhiMonth() string {
return l.ganzhiMonth
}
// GanZhiDay 日干支
func (l LunarTime) GanZhiDay() string {
return GanZhiOfDay(l.solarDate)
}
// LunarYear 农历年
func (l LunarTime) LunarYear() int {
return l.year
}
// LunarMonth 农历月
func (l LunarTime) LunarMonth() int {
return l.month
}
// LunarDay 农历日
func (l LunarTime) LunarDay() int {
return l.day
}
// IsLeap 是否闰月
func (l LunarTime) IsLeap() bool {
return l.leap
}
// Eras 朝代、皇帝、年号等信息
func (l LunarTime) Eras() []EraDesc {
return l.eras
}
// MonthDay 农历月日描述,如正月初一。此处,十一月表示为冬月,十二月表示为腊月
func (l LunarTime) MonthDay() string {
return l.desc
}
// LunarDesc 获取农历描述,如开元二年正月初一,若无年号,则返回年份描述,如二零二五年正月初一
func (l LunarTime) LunarDesc() []string {
return l.innerDescWithNianHao(false, false)
}
// LunarDescWithEmperor 获取含有君主信息的农历描述,如唐玄宗 开元二年正月初一,若无年号,则返回年份描述,如二零二五年正月初一
// 君主信息仅供参考,多个皇帝用同一个年号的场景,此处不准
func (l LunarTime) LunarDescWithEmperor() []string {
return l.innerDescWithNianHao(true, false)
}
// LunarDescWithDynasty 获取含有朝代信息的农历描述,如唐 开元二年正月初一,若无年号,则返回年份描述,如二零二五年正月初一
func (l LunarTime) LunarDescWithDynasty() []string {
return l.innerDescWithNianHao(false, true)
}
// LunarDescWithDynastyAndEmperor 获取含有朝代和君主信息的农历描述,如唐 唐玄宗 开元二年正月初一,若无年号,则返回年份描述,如二零二五年正月初一
// 君主信息仅供参考,多个皇帝用同一个年号的场景,此处不准
func (l LunarTime) LunarDescWithDynastyAndEmperor() []string {
return l.innerDescWithNianHao(true, true)
}
func (l LunarTime) innerDescWithNianHao(withEmperor bool, withDynasty bool) []string {
var res []string
if len(l.eras) > 0 {
for _, v := range l.eras {
tmp := v.String() + l.desc
if withEmperor {
tmp = v.Emperor + " " + tmp
}
if withDynasty {
tmp = v.Dynasty + " " + tmp
}
res = append(res, tmp)
}
} else {
res = append(res, number2Chinese(l.year, true)+"年"+l.desc)
}
return res
}
func (l LunarTime) LunarInfo() []LunarInfo {
var res []LunarInfo
for _, v := range l.eras {
li := LunarInfo{
SolarDate: l.solarDate,
LunarYear: l.year,
LunarYearChn: number2Chinese(l.year, true),
LunarMonth: l.month,
LunarDay: l.day,
IsLeap: l.leap,
LunarMonthDayDesc: l.desc,
GanzhiYear: GanZhiOfYear(l.year),
GanzhiMonth: l.ganzhiMonth,
GanzhiDay: GanZhiOfDay(l.solarDate),
Dynasty: v.Dynasty,
Emperor: v.Emperor,
Nianhao: v.Nianhao,
YearOfNianhao: v.YearOfNianHao,
EraDesc: v.String(),
LunarWithEraDesc: v.String() + l.desc,
ChineseZodiac: l.ShengXiao(),
}
res = append(res, li)
}
if len(l.eras) == 0 {
li := LunarInfo{
SolarDate: l.solarDate,
LunarYear: l.year,
LunarYearChn: number2Chinese(l.year, true),
LunarMonth: l.month,
LunarDay: l.day,
IsLeap: l.leap,
LunarMonthDayDesc: l.desc,
GanzhiYear: GanZhiOfYear(l.year),
GanzhiMonth: l.ganzhiMonth,
GanzhiDay: GanZhiOfDay(l.solarDate),
Dynasty: "",
Emperor: "",
Nianhao: "",
YearOfNianhao: 0,
EraDesc: number2Chinese(l.year, true) + "年",
LunarWithEraDesc: number2Chinese(l.year, true) + "年" + l.desc,
ChineseZodiac: l.ShengXiao(),
}
res = append(res, li)
}
return res
}