1. 补充农历覆盖到公元前104年
2. 农历信息中包含君主、年号、朝代 3. 丰富一些算法,修正一些问题
This commit is contained in:
@@ -21,5 +21,3 @@ func Date2JDE(date time.Time) float64 {
|
||||
func JDE2Date(jde float64) time.Time {
|
||||
return basic.JDE2Date(jde)
|
||||
}
|
||||
|
||||
|
||||
|
||||
+338
-59
@@ -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
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user