300 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			300 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								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
							 | 
						|||
| 
								 | 
							
								}
							 |