@@ -9,6 +9,12 @@ import (
99
1010var defDeltaTFn = DefaultDeltaTv2
1111
12+ // Date2JDE 日期转儒略日
13+ func Date2JDE (date time.Time ) float64 {
14+ day := float64 (date .Day ()) + float64 (date .Hour ())/ 24.0 + float64 (date .Minute ())/ 24.0 / 60.0 + float64 (date .Second ())/ 24.0 / 3600.0 + float64 (date .Nanosecond ())/ 1000000000.0 / 3600.0 / 24.0
15+ return JDECalc (date .Year (), int (date .Month ()), day )
16+ }
17+
1218/*
1319@name: 儒略日计算
1420@dec: 计算给定时间的儒略日,1582年改力后为格里高利历,之前为儒略历
@@ -39,61 +45,6 @@ func GetNowJDE() (NowJDE float64) {
3945 return
4046}
4147
42- func dt_ext (y , jsd float64 ) float64 { // 二次曲线外推,用于数值外插
43- dy := (y - 1820 ) / 100.00
44- return - 20 + jsd * dy * dy
45- }
46- func dt_cal (y float64 ) float64 { //传入年, 返回世界时UT与原子时(力学时 TD)之差, ΔT = TD - UT
47- dt_at := []float64 {
48- - 4000 , 108371.7 , - 13036.80 , 392.000 , 0.0000 ,
49- - 500 , 17201.0 , - 627.82 , 16.170 , - 0.3413 ,
50- - 150 , 12200.6 , - 346.41 , 5.403 , - 0.1593 ,
51- 150 , 9113.8 , - 328.13 , - 1.647 , 0.0377 ,
52- 500 , 5707.5 , - 391.41 , 0.915 , 0.3145 ,
53- 900 , 2203.4 , - 283.45 , 13.034 , - 0.1778 ,
54- 1300 , 490.1 , - 57.35 , 2.085 , - 0.0072 ,
55- 1600 , 120.0 , - 9.81 , - 1.532 , 0.1403 ,
56- 1700 , 10.2 , - 0.91 , 0.510 , - 0.0370 ,
57- 1800 , 13.4 , - 0.72 , 0.202 , - 0.0193 ,
58- 1830 , 7.8 , - 1.81 , 0.416 , - 0.0247 ,
59- 1860 , 8.3 , - 0.13 , - 0.406 , 0.0292 ,
60- 1880 , - 5.4 , 0.32 , - 0.183 , 0.0173 ,
61- 1900 , - 2.3 , 2.06 , 0.169 , - 0.0135 ,
62- 1920 , 21.2 , 1.69 , - 0.304 , 0.0167 ,
63- 1940 , 24.2 , 1.22 , - 0.064 , 0.0031 ,
64- 1960 , 33.2 , 0.51 , 0.231 , - 0.0109 ,
65- 1980 , 51.0 , 1.29 , - 0.026 , 0.0032 ,
66- 2000 , 63.87 , 0.1 , 0 , 0 ,
67- 2005 , 64.7 , 0.4 , 0 , 0 , //一次项记为x,则 10x=0.4秒/年*(2015-2005),解得x=0.4
68- 2015 , 69 ,
69- }
70- y0 := dt_at [len (dt_at )- 2 ] //表中最后一年
71- t0 := dt_at [len (dt_at )- 1 ] //表中最后一年的 deltatT
72- if y >= y0 {
73- jsd := float64 (31 ) // sjd是y1年之后的加速度估计
74- // 瑞士星历表jsd=31, NASA网站jsd=32, skmap的jsd=29
75- if y > y0 + 100.00 {
76- return dt_ext (y , jsd )
77- }
78- v := dt_ext (y , jsd ) //二次曲线外推
79- dv := dt_ext (y0 , jsd ) - t0 // ye年的二次外推与te的差
80- return (v - dv * (y0 + 100.00 - y )/ 100.00 )
81- }
82- d := dt_at
83- var i int
84- for i = 0 ; i < len (d ); i += 5 {
85- if float64 (y ) < d [i + 5 ] {
86- break
87- // 判断年所在的区间
88- }
89- }
90- t1 := (y - d [i ]) / (d [i + 5 ] - d [i ]) * 10.00 //////// 三次插值, 保证精确性
91- t2 := t1 * t1
92- t3 := t2 * t1
93- res := d [i + 1 ] + d [i + 2 ]* t1 + d [i + 3 ]* t2 + d [i + 4 ]* t3
94- return (res )
95- }
96-
9748func DeltaT (date float64 , isJDE bool ) float64 {
9849 return defDeltaTFn (date , isJDE )
9950}
@@ -108,50 +59,6 @@ func GetDeltaTFn() func(float64, bool) float64 {
10859 return defDeltaTFn
10960}
11061
111- func OldDefaultDeltaT (Date float64 , IsJDE bool ) (Result float64 ) { //传入年或儒略日,传出为秒
112- var Year float64
113- if IsJDE {
114- dates := JDE2Date (Date )
115- Year = float64 (dates .Year ()) + float64 (dates .YearDay ())/ 365.0
116- } else {
117- Year = Date
118- }
119- if Year < 2100 && Year >= 2010 {
120- return dt_cal (Year )
121- }
122- return DefaultDeltaT (Date , IsJDE )
123- }
124-
125- func DefaultDeltaT (Date float64 , IsJDE bool ) (Result float64 ) { //传入年或儒略日,传出为秒
126- var Year float64
127- if IsJDE {
128- dates := JDE2Date (Date )
129- Year = float64 (dates .Year ()) + float64 (dates .YearDay ())/ 365.0
130- } else {
131- Year = Date
132- }
133- if Year < 2010 {
134- Result = dt_cal (Year )
135- return
136- }
137- if Year < 2100 && Year >= 2010 {
138- var t = (Year - 2000.0 )
139- Result = 62.92 + 0.32217 * t + 0.005589 * t * t
140- return
141- }
142- if Year >= 2100 && Year <= 2150 {
143- Result = - 20 + 32 * (((Year - 1820.0 )/ 100.0 )* ((Year - 1820.0 )/ 100.0 )) - 0.5628 * (2150 - Year )
144- return
145- }
146- if Year > 2150 {
147- //tmp=(Year-1820)/100;
148- //Result= -20 + 32 * tmp*tmp;
149- Result = dt_cal (Year )
150- return
151- }
152- return
153- }
154-
15562func DefaultDeltaTv2 (date float64 , isJd bool ) float64 { //传入年或儒略日,传出为秒
15663 if ! isJd {
15764 date = JDECalc (int (date ), int ((date - math .Floor (date ))* 12 )+ 1 , (date - math .Floor (date ))* 365.25 + 1 )
@@ -240,7 +147,6 @@ func DeltaTv2(jd float64) float64 {
240147}
241148
242149func TD2UT (JDE float64 , UT2TD bool ) float64 { // true 世界时转力学时CC,false 力学时转世界时VV
243-
244150 Deltat := DeltaT (JDE , true )
245151 if UT2TD {
246152 return JDE + Deltat / 3600 / 24
@@ -249,9 +155,6 @@ func TD2UT(JDE float64, UT2TD bool) float64 { // true 世界时转力学时CC,
249155 }
250156}
251157
252- /*
253- * @name: JDE转日期,输出为数组
254- */
255158func JDE2Date (JD float64 ) time.Time {
256159 JD = JD + 0.5
257160 Z := float64 (int (JD ))
@@ -330,12 +233,6 @@ func JDE2DateByZone(JD float64, tz *time.Location, byZone bool) time.Time {
330233 Add (time .Duration (int64 (1000000000 * tms ))).In (tz )
331234}
332235
333- // Date2JDE 日期转儒略日
334- func Date2JDE (date time.Time ) float64 {
335- day := float64 (date .Day ()) + float64 (date .Hour ())/ 24.0 + float64 (date .Minute ())/ 24.0 / 60.0 + float64 (date .Second ())/ 24.0 / 3600.0 + float64 (date .Nanosecond ())/ 1000000000.0 / 3600.0 / 24.0
336- return JDECalc (date .Year (), int (date .Month ()), day )
337- }
338-
339236func GetLunar (year , month , day int , tz float64 ) (lyear , lmonth , lday int , leap bool , result string ) {
340237 julianDayEpoch := JDECalc (year , month , float64 (day ))
341238 // 确定农历年份
0 commit comments