summaryrefslogtreecommitdiffstats
path: root/src/Julian.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Julian.cpp')
-rw-r--r--src/Julian.cpp116
1 files changed, 53 insertions, 63 deletions
diff --git a/src/Julian.cpp b/src/Julian.cpp
index 907c94e..5a0522b 100644
--- a/src/Julian.cpp
+++ b/src/Julian.cpp
@@ -9,93 +9,83 @@
9 * 但是我目前提供的中time_t类型为64位整数,因而可以表示数千年的时间范围 9 * 但是我目前提供的中time_t类型为64位整数,因而可以表示数千年的时间范围
10 */ 10 */
11 11
12double Julian::d[23][5]={ 12double Julian::d[23][5] = {
13 {-4000, 108371.700000, -13036.800000, 392.000000, 0.000000}, 13 {-4000, 108371.700000, -13036.800000, 392.000000, 0.000000},
14 { -500, 17201.000000, -627.820000, 16.170000, -0.341300}, 14 {-500, 17201.000000, -627.820000, 16.170000, -0.341300},
15 { -150, 12200.600000, -346.410000, 5.403000, -0.159300}, 15 {-150, 12200.600000, -346.410000, 5.403000, -0.159300},
16 { 150, 9113.800000, -328.130000, -1.647000, 0.037700}, 16 {150, 9113.800000, -328.130000, -1.647000, 0.037700},
17 { 500, 5707.500000, -391.410000, 0.915000, 0.314500}, 17 {500, 5707.500000, -391.410000, 0.915000, 0.314500},
18 { 900, 2203.400000, -283.450000, 13.034000, -0.177800}, 18 {900, 2203.400000, -283.450000, 13.034000, -0.177800},
19 { 1300, 490.100000, -57.350000, 2.085000, -0.007200}, 19 {1300, 490.100000, -57.350000, 2.085000, -0.007200},
20 { 1600, 120.000000, -9.810000, -1.532000, 0.140300}, 20 {1600, 120.000000, -9.810000, -1.532000, 0.140300},
21 { 1700, 10.200000, -0.910000, 0.510000, -0.037000}, 21 {1700, 10.200000, -0.910000, 0.510000, -0.037000},
22 { 1800, 13.400000, -0.720000, 0.202000, -0.019300}, 22 {1800, 13.400000, -0.720000, 0.202000, -0.019300},
23 { 1830, 7.800000, -1.810000, 0.416000, -0.024700}, 23 {1830, 7.800000, -1.810000, 0.416000, -0.024700},
24 { 1860, 8.300000, -0.130000, -0.406000, 0.029200}, 24 {1860, 8.300000, -0.130000, -0.406000, 0.029200},
25 { 1880, -5.400000, 0.320000, -0.183000, 0.017300}, 25 {1880, -5.400000, 0.320000, -0.183000, 0.017300},
26 { 1900, -2.300000, 2.060000, 0.169000, -0.013500}, 26 {1900, -2.300000, 2.060000, 0.169000, -0.013500},
27 { 1920, 21.200000, 1.690000, -0.304000, 0.016700}, 27 {1920, 21.200000, 1.690000, -0.304000, 0.016700},
28 { 1940, 24.200000, 1.220000, -0.064000, 0.003100}, 28 {1940, 24.200000, 1.220000, -0.064000, 0.003100},
29 { 1960, 33.200000, 0.510000, 0.231000, -0.010900}, 29 {1960, 33.200000, 0.510000, 0.231000, -0.010900},
30 { 1980, 51.000000, 1.290000, -0.026000, 0.003200}, 30 {1980, 51.000000, 1.290000, -0.026000, 0.003200},
31 { 2000, 63.870000, 0.100000, 0.000000, 0.000000}, 31 {2000, 63.870000, 0.100000, 0.000000, 0.000000},
32 { 2005, 64.700000, 0.210000, 0.000000, 0.000000}, 32 {2005, 64.700000, 0.210000, 0.000000, 0.000000},
33 { 2012, 66.800000, 0.220000, 0.000000, 0.000000}, 33 {2012, 66.800000, 0.220000, 0.000000, 0.000000},
34 { 2018, 69.000000, 0.360000, 0.000000, 0.000000}, 34 {2018, 69.000000, 0.360000, 0.000000, 0.000000},
35 { 2028, 72.600000, 0.000000, 0.000000, 0.000000} 35 {2028, 72.600000, 0.000000, 0.000000, 0.000000}};
36};
37 36
38double Julian::dt_ext(int y,double jsd) 37double Julian::dt_ext(int y, double jsd) {
39{ 38 double dy = (double)(y - 1820) / 100.0;
40 double dy=(double)(y-1820)/100.0; 39 return -20 + jsd * dy * dy;
41 return -20+jsd*dy*dy;
42} 40}
43 41
44//计算力学时与世界时之差,传入年份 42//计算力学时与世界时之差,传入年份
45double Julian::delta_t(int y) 43double Julian::delta_t(int y) {
46{ 44 int y0 = d[22][0]; //表中最后一行的年份
47 int y0=d[22][0];//表中最后一行的年份 45 double t0 = d[22][1]; //表中最后一行的delta_t
48 double t0=d[22][1];//表中最后一行的delta_t
49 double jsd; 46 double jsd;
50 47
51 if(y>y0) 48 if (y > y0) {
52 { 49 jsd = 31;
53 jsd=31; 50 if (y - y0 > 100) {
54 if(y-y0>100) 51 return dt_ext(y, jsd);
55 {
56 return dt_ext(y,jsd);
57 } 52 }
58 53
59 double v=dt_ext(y,jsd); 54 double v = dt_ext(y, jsd);
60 double dv=dt_ext(y0,jsd)-t0; 55 double dv = dt_ext(y0, jsd) - t0;
61 return v-dv*(y0+100-y)/100; 56 return v - dv * (y0 + 100 - y) / 100;
62 } 57 }
63 58
64 double res; 59 double res;
65 for(int i=0;i<22;i++) 60 for (int i = 0; i < 22; i++) {
66 { 61 if (y < d[i + 1][0]) {
67 if(y<d[i+1][0])
68 {
69 break; 62 break;
70 } 63 }
71 double t1=(y-d[i][0])/(d[i+1][0]-d[i][0])*10; 64 double t1 = (y - d[i][0]) / (d[i + 1][0] - d[i][0]) * 10;
72 double t2=t1*t1; 65 double t2 = t1 * t1;
73 double t3=t2*t1; 66 double t3 = t2 * t1;
74 res=d[i][1]+d[i][2]*t1+d[i][3]*t2+d[i][4]*t3; 67 res = d[i][1] + d[i][2] * t1 + d[i][3] * t2 + d[i][4] * t3;
75 } 68 }
76 return res; 69 return res;
77} 70}
78 71
79// 计算儒略日 72// 计算儒略日
80double Julian::getJulianDay(time_t time) 73double Julian::getJulianDay(time_t time) {
81{ 74 double t = (double)time;
82 double t=(double)time; 75 // 2440587.5为1970年1月1日0时的儒略日数
83 //2440587.5为1970年1月1日0时的儒略日数 76 return (double)t / 86400.0 + 2440587.5;
84 return (double)t/86400.0+2440587.5;
85} 77}
86 78
87// 计算儒略千年数,自JD2000(即2000年1月1日12时)起算 79// 计算儒略千年数,自JD2000(即2000年1月1日12时)起算
88double Julian::getJulianKiloYear(time_t time) 80double Julian::getJulianKiloYear(time_t time) {
89{
90 double jd = getJulianDay(time); 81 double jd = getJulianDay(time);
91 //2451545.0为2000年1月1日12时的儒略日数,365250.0为一千年的天数 82 // 2451545.0为2000年1月1日12时的儒略日数,365250.0为一千年的天数
92 return (double)(jd-2451545.0)/365250.0; 83 return (double)(jd - 2451545.0) / 365250.0;
93} 84}
94 85
95//儒略千年数转时间戳 86//儒略千年数转时间戳
96time_t Julian::kiloYearToTime(double t,int year) 87time_t Julian::kiloYearToTime(double t, int year) {
97{ 88 double jd = t * 365250.0 + 2451545.0;
98 double jd=t*365250.0+2451545.0; 89 time_t time = (time_t)((jd - 2440587.5) * 86400.0 - delta_t(year));
99 time_t time=(time_t)((jd-2440587.5)*86400.0-delta_t(year));
100 return time; 90 return time;
101} 91}