@@ -78,8 +78,19 @@ func SolarToLunar(date time.Time) (Time, error) {
7878 return innerSolarToLunar (date )
7979}
8080
81+ // SolarToLunarByYMD 公历转农历
82+ // 传入 公历年月日
83+ // 返回 包含农历信息的Time结构体
84+ // 支持年份:[-103,3000]
85+ // [-103,1912] 按照古代历法提供的农历信息
86+ // (1912,3000]按现行农历GB/T 33661-2017算法计算
87+ func SolarToLunarByYMD (year , month , day int ) (Time , error ) {
88+ return innerSolarToLunarByYMD (year , month , day )
89+ }
90+
8191func innerSolarToLunar (date time.Time ) (Time , error ) {
82- if date .Year () < - 103 || date .Year () > 3000 {
92+ date = date .In (getCst ())
93+ if date .Year () < - 103 || date .Year () > 9999 {
8394 return Time {}, fmt .Errorf ("日期超出范围" )
8495 }
8596 if date .Year () <= 1912 {
@@ -96,6 +107,30 @@ func innerSolarToLunar(date time.Time) (Time, error) {
96107 return transformModenLunar2Time (date , y , m , d , l , desc ), nil
97108}
98109
110+ func innerSolarToLunarByYMD (year , month , day int ) (Time , error ) {
111+ if year < - 103 || year > 9999 {
112+ return Time {}, fmt .Errorf ("日期超出范围" )
113+ }
114+ if month < 1 || month > 12 {
115+ return Time {}, fmt .Errorf ("月份超出范围" )
116+ }
117+ if day < 1 || day > 31 {
118+ return Time {}, fmt .Errorf ("日期超出范围" )
119+ }
120+ if year <= 1912 {
121+ return innerSolarToLunarHanQingByYMD (year , month , day , time.Time {}), nil
122+ }
123+ if year < 2400 {
124+ y , m , d , l , desc := rapidLunarModern (year , month , day )
125+ if desc == "无法获取农历信息" {
126+ return Time {}, fmt .Errorf ("无法获取农历信息" )
127+ }
128+ return transformModenLunar2Time (time .Date (year , time .Month (month ), day , 0 , 0 , 0 , 0 , getCst ()), y , m , d , l , desc ), nil
129+ }
130+ y , m , d , l , desc := basic .GetLunar (year , month , day , 8.0 / 24.0 )
131+ return transformModenLunar2Time (time .Date (year , time .Month (month ), day , 0 , 0 , 0 , 0 , getCst ()), y , m , d , l , desc ), nil
132+ }
133+
99134func transformModenLunar2Time (date time.Time , year , month , day int , leap bool , desc string ) Time {
100135 return Time {
101136 solarTime : date ,
@@ -141,13 +176,24 @@ func LunarToSolar(desc string) ([]Time, error) {
141176}
142177
143178// LunarToSolarSingle 农历转公历
179+ // Deprecated: 推荐使用LunarToSolarByYMD
144180// 传入 农历年月日,是否闰月
145181// 传出 包含公里农历信息的Time结构体
146182// 支持年份:[-103,3000]
147183// [-103,1912] 按照古代历法提供的农历信息,注意,这里农历月份代表的是以当时的历法推定的农历月与正月的距离,正月为1,二月为2,依次类推,闰月显示所闰月
148184// (1912,3000]按现行农历GB/T 33661-2017算法计算
149185func LunarToSolarSingle (year , month , day int , leap bool ) (Time , error ) {
150- if year < - 103 || year > 3000 {
186+ return LunarToSolarByYMD (year , month , day , leap )
187+ }
188+
189+ // LunarToSolarByYMD 农历转公历
190+ // 传入 农历年月日,是否闰月
191+ // 传出 包含公里农历信息的Time结构体
192+ // 支持年份:[-103,3000]
193+ // [-103,1912] 按照古代历法提供的农历信息,注意,这里农历月份代表的是以当时的历法推定的农历月与正月的距离,正月为1,二月为2,依次类推,闰月显示所闰月
194+ // (1912,3000]按现行农历GB/T 33661-2017算法计算
195+ func LunarToSolarByYMD (year , month , day int , leap bool ) (Time , error ) {
196+ if year < - 103 || year > 9999 {
151197 return Time {}, fmt .Errorf ("年份超出范围" )
152198 }
153199 if year <= 1912 {
0 commit comments