22#include < ctime>
33#include < math.h>
44
5- double JD (int y, int m, int d, int h, int mi, double s)
5+ // year month day hour minute second
6+ double JD (int y, int m, int d, int h, int mi, float s)
67 {
78
89 double jd, dd ;
@@ -15,7 +16,9 @@ double JD(int y, int m, int d, int h, int mi, double s)
1516
1617 }
1718
18- double d_d (int y0, int m0, int d0, int h0, int mi0, float s0, int y, int m, int d, int h, int mi, double s)
19+
20+ // year 0 month 0 day 0 hour 0 minute 0 sec 0 year month day hour minute second
21+ double d_d (int y0, int m0, int d0, int h0, int mi0, float s0, int y, int m, int d, int h, int mi, float s)
1922 {
2023
2124 struct std ::tm a = { s0, mi0, h0, d0, m0 - 1 , y0 - 1900 } ;
@@ -32,7 +35,7 @@ double d_d(int y0, int m0, int d0, int h0, int mi0, float s0, int y, int m, int
3235
3336 }
3437
35- double GMST (int y, int m, int d, int h, int mi, double s)
38+ double GMST (int y, int m, int d, int h, int mi, float s)
3639 {
3740
3841 double D, T, gmst ;
@@ -51,3 +54,37 @@ double GMST(int y, int m, int d, int h, int mi, double s)
5154
5255 }
5356
57+
58+
59+ double UTC2TAI (int y, int m, int d, int h, int mi, double s)
60+ {
61+
62+ int n = 2020 - 1972 + 1 ; // limit array
63+ double TAI ;
64+
65+ int leap[n][2 ] = { {1 ,1 }, {0 ,1 }, {0 ,1 }, {0 ,1 }, {0 ,1 }, {0 ,1 }, {0 ,1 }, {0 ,1 }, {0 ,0 }, {1 ,0 },
66+ {1 ,0 }, {1 ,0 }, {0 ,0 }, {1 ,0 }, {0 ,0 }, {0 ,1 }, {0 ,0 }, {0 ,1 }, {0 ,1 }, {0 ,0 },
67+ {1 ,0 }, {1 ,0 }, {1 ,0 }, {0 ,1 }, {0 ,0 }, {1 ,0 }, {0 ,1 }, {0 ,0 }, {0 ,0 }, {0 ,0 },
68+ {0 ,0 }, {0 ,0 }, {0 ,0 }, {0 ,1 }, {0 ,0 }, {0 ,0 }, {0 ,1 }, {0 ,0 }, {0 ,0 }, {0 ,0 },
69+ {1 ,0 }, {0 ,0 }, {0 ,0 }, {1 ,0 }, {0 ,1 }, {0 ,0 }, {0 ,0 }, {0 ,0 }, {0 ,0 } } ; // leap seconds each year since 1972.
70+ // Yes, I am masochist
71+ int l = 10 ; // leap seconds
72+
73+ for (int i = 0 ; i < (y - 1972 ); i++)
74+ {
75+
76+ if (i == n)
77+ break ;
78+
79+ l += leap[i][0 ] + leap[i][1 ] ;
80+
81+ }
82+
83+ if ( ( (y - 1972 ) < n ) and (m > 6 ) )
84+ l += leap[y - 1972 ][0 ] ;
85+
86+ TAI = h + double (mi) * 0.01666666666666666 + (s + double (l)) * 2.777777777777777777e-4 ;
87+
88+ return TAI ;
89+
90+ }
0 commit comments