@saber-usa/node-common 1.7.7-alpha.1 → 1.7.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -41
- package/package.json +52 -52
- package/src/FrameConverter.js +1121 -1121
- package/src/LLA.js +179 -179
- package/src/LaunchNominalClass.js +753 -753
- package/src/NodeVector3D.js +71 -71
- package/src/OrbitUtils.js +309 -309
- package/src/PropagateUtils.js +100 -100
- package/src/ShadowGEOCalculator.js +203 -203
- package/src/TimeConverter.js +309 -309
- package/src/astro.js +3301 -3301
- package/src/ballisticPropagator.js +1037 -1037
- package/src/checkNetwork.cjs +20 -20
- package/src/constants.js +37 -37
- package/src/fixDate.js +62 -62
- package/src/index.js +47 -47
- package/src/launchNominal.js +208 -208
- package/src/loggerFactory.cjs +98 -98
- package/src/s3.js +59 -59
- package/src/transform.js +35 -35
- package/src/udl.js +116 -116
- package/src/utils.js +406 -406
package/src/TimeConverter.js
CHANGED
|
@@ -1,309 +1,309 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TimeConverter - Port from C# TimeConverter
|
|
3
|
-
* Handles conversions between different time systems (UTC, UT1, TAI, GPS, TT)
|
|
4
|
-
* and Julian date calculations
|
|
5
|
-
*/
|
|
6
|
-
class TimeConverter {
|
|
7
|
-
// Constants from the C# implementation
|
|
8
|
-
static JULIAN_UTC = 2415018.5; // Julian Date of midnight, December 30, 1899
|
|
9
|
-
static JULIAN_MJD = 2400000.5; // = JD - MJD
|
|
10
|
-
|
|
11
|
-
// These values need to be changed periodically
|
|
12
|
-
// See http://www.stjarnhimlen.se/comp/time.html for bi-annual values (in seconds)
|
|
13
|
-
// See https://hpiers.obspm.fr/eoppc/eop/eopc04/eopc04_IAU2000.62-now for daily updated values
|
|
14
|
-
// As of 6/22/22:
|
|
15
|
-
static TAI_UTC = 37;
|
|
16
|
-
static GPS_UTC = 18;
|
|
17
|
-
static TT_UT1 = 69.29;
|
|
18
|
-
static UT1_UTC = -0.0977075;
|
|
19
|
-
static LOD = 0.0000022; // Length of day correction
|
|
20
|
-
static XP = 0.132949; // Polar motion X
|
|
21
|
-
static YP = 0.486774; // Polar motion Y
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Constructor accepts either a UTC Date or a Julian date number
|
|
25
|
-
* @param {Date|number} input - Either a Date object (UTC) or a Julian date number
|
|
26
|
-
*/
|
|
27
|
-
constructor(input) {
|
|
28
|
-
if (typeof input === "number") {
|
|
29
|
-
// Input is a Julian date
|
|
30
|
-
this._julian = input;
|
|
31
|
-
this._utc = null;
|
|
32
|
-
} else {
|
|
33
|
-
// Input is a Date object
|
|
34
|
-
this._utc = input instanceof Date ? input : new Date(input);
|
|
35
|
-
this._julian = null;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// Instance properties
|
|
40
|
-
get UTC() {
|
|
41
|
-
return this._utc || TimeConverter.julianToDateTime(this.JulianUTC);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
get UT1() {
|
|
45
|
-
return TimeConverter.utcToUT1(this.UTC);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
get TAI() {
|
|
49
|
-
return TimeConverter.utcToTAI(this.UTC);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
get GPS() {
|
|
53
|
-
return TimeConverter.utcToGPS(this.UTC);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
get TT() {
|
|
57
|
-
return TimeConverter.ut1ToTT(this.UT1);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
get GMST() {
|
|
61
|
-
return TimeConverter.getGMST(this.JulianUT1);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
get JulianUTC() {
|
|
65
|
-
return this._julian !== null ? this._julian : TimeConverter.dateTimeToJulian(this.UTC);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
get JulianUT1() {
|
|
69
|
-
return TimeConverter.dateTimeToJulian(this.UT1);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
get JulianTAI() {
|
|
73
|
-
return TimeConverter.dateTimeToJulian(this.TAI);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
get JulianGPS() {
|
|
77
|
-
return TimeConverter.dateTimeToJulian(this.GPS);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
get JulianTT() {
|
|
81
|
-
return TimeConverter.dateTimeToJulian(this.TT);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
get JulianCenturiesTT() {
|
|
85
|
-
return TimeConverter.julianToCenturiesTxxx(this.JulianTT);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// Backwards compatibility property
|
|
89
|
-
get date() {
|
|
90
|
-
return this.UTC;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Static factory methods
|
|
94
|
-
static FromJulianUTC(julian) {
|
|
95
|
-
return new TimeConverter(julian);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
static FromGregorianUTC(date) {
|
|
99
|
-
return new TimeConverter(date);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Convert Julian date to JavaScript Date
|
|
104
|
-
* @param {number} julian - Julian date
|
|
105
|
-
* @return {Date} JavaScript Date object
|
|
106
|
-
*/
|
|
107
|
-
static julianToDateTime(julian) {
|
|
108
|
-
// Using the C# formula: DateTime.FromOADate(julian - JULIAN_UTC)
|
|
109
|
-
// OLE Automation Date is days since Dec 30, 1899
|
|
110
|
-
const daysSince1899 = julian - TimeConverter.JULIAN_UTC;
|
|
111
|
-
const millisSince1899 = daysSince1899 * 86400000; // Convert days to milliseconds
|
|
112
|
-
const date1899 = new Date(Date.UTC(1899, 11, 30, 0, 0, 0, 0)); // Dec 30, 1899
|
|
113
|
-
return new Date(date1899.getTime() + millisSince1899);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Convert Date to Julian date
|
|
118
|
-
* @param {Date} date - JavaScript Date object
|
|
119
|
-
* @return {number} Julian date
|
|
120
|
-
*/
|
|
121
|
-
static dateTimeToJulian(date) {
|
|
122
|
-
// Vallado Fundamentals, Algorithm 14 p. 183
|
|
123
|
-
const year = date.getUTCFullYear();
|
|
124
|
-
const month = date.getUTCMonth() + 1; // JavaScript months are 0-11
|
|
125
|
-
const day = date.getUTCDate();
|
|
126
|
-
const hour = date.getUTCHours();
|
|
127
|
-
const minute = date.getUTCMinutes();
|
|
128
|
-
const second = date.getUTCSeconds();
|
|
129
|
-
const millisecond = date.getUTCMilliseconds();
|
|
130
|
-
|
|
131
|
-
const jd = 367 * year - Math.floor(7 * (year + Math.floor((month + 9) / 12)) / 4)
|
|
132
|
-
+ Math.floor(275 * month / 9) + day + 1721013.5
|
|
133
|
-
+ (((second + millisecond * 1e-3) / 60 + minute) / 60 + hour) / 24;
|
|
134
|
-
|
|
135
|
-
return jd;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Convert Julian date to Modified Julian Date
|
|
140
|
-
* @param {number} julian - Julian date
|
|
141
|
-
* @return {number} Modified Julian Date
|
|
142
|
-
*/
|
|
143
|
-
static JulianToMJD(julian) {
|
|
144
|
-
return julian - TimeConverter.JULIAN_MJD;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Convert Modified Julian Date to Julian date
|
|
149
|
-
* @param {number} mjd - Modified Julian Date
|
|
150
|
-
* @return {number} Julian date
|
|
151
|
-
*/
|
|
152
|
-
static MJDToJulian(mjd) {
|
|
153
|
-
return mjd + TimeConverter.JULIAN_MJD;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Convert TAI to UTC
|
|
158
|
-
* @param {Date} tai - TAI time
|
|
159
|
-
* @return {Date} UTC time
|
|
160
|
-
*/
|
|
161
|
-
static TAIToUTC(tai) {
|
|
162
|
-
const utcMillis = tai.getTime() - (TimeConverter.TAI_UTC * 1000);
|
|
163
|
-
return new Date(utcMillis);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Convert UTC to TAI
|
|
168
|
-
* @param {Date} utc - UTC time
|
|
169
|
-
* @return {Date} TAI time
|
|
170
|
-
*/
|
|
171
|
-
static utcToTAI(utc) {
|
|
172
|
-
const taiMillis = utc.getTime() + (TimeConverter.TAI_UTC * 1000);
|
|
173
|
-
return new Date(taiMillis);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* Convert GPS to UTC
|
|
178
|
-
* @param {Date} gps - GPS time
|
|
179
|
-
* @return {Date} UTC time
|
|
180
|
-
*/
|
|
181
|
-
static GPSToUTC(gps) {
|
|
182
|
-
const utcMillis = gps.getTime() - (TimeConverter.GPS_UTC * 1000);
|
|
183
|
-
return new Date(utcMillis);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* Convert UTC to GPS
|
|
188
|
-
* @param {Date} utc - UTC time
|
|
189
|
-
* @return {Date} GPS time
|
|
190
|
-
*/
|
|
191
|
-
static utcToGPS(utc) {
|
|
192
|
-
const gpsMillis = utc.getTime() + (TimeConverter.GPS_UTC * 1000);
|
|
193
|
-
return new Date(gpsMillis);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* Convert TT to UT1
|
|
198
|
-
* @param {Date} tt - Terrestrial Time
|
|
199
|
-
* @return {Date} UT1 time
|
|
200
|
-
*/
|
|
201
|
-
static TTToUT1(tt) {
|
|
202
|
-
const ut1Millis = tt.getTime() - (TimeConverter.TT_UT1 * 1000);
|
|
203
|
-
return new Date(ut1Millis);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
/**
|
|
207
|
-
* Convert UT1 to TT
|
|
208
|
-
* @param {Date} ut1 - UT1 time
|
|
209
|
-
* @return {Date} Terrestrial Time
|
|
210
|
-
*/
|
|
211
|
-
static ut1ToTT(ut1) {
|
|
212
|
-
const ttMillis = ut1.getTime() + (TimeConverter.TT_UT1 * 1000);
|
|
213
|
-
return new Date(ttMillis);
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/**
|
|
217
|
-
* Convert UT1 to UTC
|
|
218
|
-
* @param {Date} ut1 - UT1 time
|
|
219
|
-
* @return {Date} UTC time
|
|
220
|
-
*/
|
|
221
|
-
static UT1ToUTC(ut1) {
|
|
222
|
-
const utcMillis = ut1.getTime() - (TimeConverter.UT1_UTC * 1000);
|
|
223
|
-
return new Date(utcMillis);
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
/**
|
|
227
|
-
* Convert UTC to UT1
|
|
228
|
-
* @param {Date} utc - UTC time
|
|
229
|
-
* @return {Date} UT1 time
|
|
230
|
-
*/
|
|
231
|
-
static utcToUT1(utc) {
|
|
232
|
-
const ut1Millis = utc.getTime() + (TimeConverter.UT1_UTC * 1000);
|
|
233
|
-
return new Date(ut1Millis);
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
/**
|
|
237
|
-
* Get Greenwich Mean Sidereal Time from UT1 julian
|
|
238
|
-
* @param {number} jdut1 - Julian date UT1
|
|
239
|
-
* @param {boolean} wrap360 - Whether to wrap to 0-360 degrees
|
|
240
|
-
* @return {Object} Angle object with Radians property
|
|
241
|
-
*/
|
|
242
|
-
static getGMST(jdut1, wrap360 = true) {
|
|
243
|
-
const tut1 = TimeConverter.julianToCenturiesTxxx(jdut1);
|
|
244
|
-
let gmst = -6.2e-6 * tut1 * tut1 * tut1 + 0.093104 * tut1 * tut1
|
|
245
|
-
+ (876600.0 * 3600 + 8640184.812866) * tut1 + 67310.54841; // seconds
|
|
246
|
-
gmst = gmst * (Math.PI / 180) / 240.0 % (2.0 * Math.PI); // 360/86400 = 1/240, to deg, to rad
|
|
247
|
-
|
|
248
|
-
// Check quadrants
|
|
249
|
-
if (gmst < 0.0 && wrap360) {
|
|
250
|
-
gmst += 2.0 * Math.PI;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
return {
|
|
254
|
-
Radians: gmst,
|
|
255
|
-
Degrees: gmst * 180 / Math.PI,
|
|
256
|
-
};
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
/**
|
|
260
|
-
* Get Local Mean Sidereal Time from longitude and UT1 julian
|
|
261
|
-
* @param {number} lonDeg - Longitude in degrees (-180 to 180)
|
|
262
|
-
* @param {number} jdut1 - Julian date UT1
|
|
263
|
-
* @param {boolean} wrap360 - Whether to wrap to 0-360 degrees
|
|
264
|
-
* @return {Object} Object containing lmst (radians) and gmst (radians)
|
|
265
|
-
*/
|
|
266
|
-
static GetLMST(lonDeg, jdut1, wrap360 = true) {
|
|
267
|
-
const gmstAngle = TimeConverter.getGMST(jdut1, wrap360);
|
|
268
|
-
const gmst = gmstAngle.Radians;
|
|
269
|
-
let lst = lonDeg * Math.PI / 180 + gmst;
|
|
270
|
-
|
|
271
|
-
// Check quadrants
|
|
272
|
-
lst %= 2.0 * Math.PI;
|
|
273
|
-
if (lst < 0.0 && wrap360) {
|
|
274
|
-
lst += 2.0 * Math.PI;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
return {
|
|
278
|
-
lmst: lst,
|
|
279
|
-
gmst: gmst,
|
|
280
|
-
};
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
/**
|
|
284
|
-
* Convert Julian date to centuries since J2000
|
|
285
|
-
* @param {number} julian - Julian date
|
|
286
|
-
* @return {number} Centuries since J2000
|
|
287
|
-
*/
|
|
288
|
-
static julianToCenturiesTxxx(julian) {
|
|
289
|
-
return (julian - 2451545.0) / 36525.0;
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
/**
|
|
294
|
-
* RaDec class for Right Ascension and Declination
|
|
295
|
-
*/
|
|
296
|
-
class RaDec {
|
|
297
|
-
constructor(raDeg, decDeg) {
|
|
298
|
-
this.RightAscension = {
|
|
299
|
-
Degrees: raDeg,
|
|
300
|
-
Radians: raDeg * Math.PI / 180,
|
|
301
|
-
};
|
|
302
|
-
this.Declination = {
|
|
303
|
-
Degrees: decDeg,
|
|
304
|
-
Radians: decDeg * Math.PI / 180,
|
|
305
|
-
};
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
export {TimeConverter, RaDec};
|
|
1
|
+
/**
|
|
2
|
+
* TimeConverter - Port from C# TimeConverter
|
|
3
|
+
* Handles conversions between different time systems (UTC, UT1, TAI, GPS, TT)
|
|
4
|
+
* and Julian date calculations
|
|
5
|
+
*/
|
|
6
|
+
class TimeConverter {
|
|
7
|
+
// Constants from the C# implementation
|
|
8
|
+
static JULIAN_UTC = 2415018.5; // Julian Date of midnight, December 30, 1899
|
|
9
|
+
static JULIAN_MJD = 2400000.5; // = JD - MJD
|
|
10
|
+
|
|
11
|
+
// These values need to be changed periodically
|
|
12
|
+
// See http://www.stjarnhimlen.se/comp/time.html for bi-annual values (in seconds)
|
|
13
|
+
// See https://hpiers.obspm.fr/eoppc/eop/eopc04/eopc04_IAU2000.62-now for daily updated values
|
|
14
|
+
// As of 6/22/22:
|
|
15
|
+
static TAI_UTC = 37;
|
|
16
|
+
static GPS_UTC = 18;
|
|
17
|
+
static TT_UT1 = 69.29;
|
|
18
|
+
static UT1_UTC = -0.0977075;
|
|
19
|
+
static LOD = 0.0000022; // Length of day correction
|
|
20
|
+
static XP = 0.132949; // Polar motion X
|
|
21
|
+
static YP = 0.486774; // Polar motion Y
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Constructor accepts either a UTC Date or a Julian date number
|
|
25
|
+
* @param {Date|number} input - Either a Date object (UTC) or a Julian date number
|
|
26
|
+
*/
|
|
27
|
+
constructor(input) {
|
|
28
|
+
if (typeof input === "number") {
|
|
29
|
+
// Input is a Julian date
|
|
30
|
+
this._julian = input;
|
|
31
|
+
this._utc = null;
|
|
32
|
+
} else {
|
|
33
|
+
// Input is a Date object
|
|
34
|
+
this._utc = input instanceof Date ? input : new Date(input);
|
|
35
|
+
this._julian = null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Instance properties
|
|
40
|
+
get UTC() {
|
|
41
|
+
return this._utc || TimeConverter.julianToDateTime(this.JulianUTC);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
get UT1() {
|
|
45
|
+
return TimeConverter.utcToUT1(this.UTC);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
get TAI() {
|
|
49
|
+
return TimeConverter.utcToTAI(this.UTC);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
get GPS() {
|
|
53
|
+
return TimeConverter.utcToGPS(this.UTC);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
get TT() {
|
|
57
|
+
return TimeConverter.ut1ToTT(this.UT1);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
get GMST() {
|
|
61
|
+
return TimeConverter.getGMST(this.JulianUT1);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
get JulianUTC() {
|
|
65
|
+
return this._julian !== null ? this._julian : TimeConverter.dateTimeToJulian(this.UTC);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
get JulianUT1() {
|
|
69
|
+
return TimeConverter.dateTimeToJulian(this.UT1);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
get JulianTAI() {
|
|
73
|
+
return TimeConverter.dateTimeToJulian(this.TAI);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
get JulianGPS() {
|
|
77
|
+
return TimeConverter.dateTimeToJulian(this.GPS);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
get JulianTT() {
|
|
81
|
+
return TimeConverter.dateTimeToJulian(this.TT);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
get JulianCenturiesTT() {
|
|
85
|
+
return TimeConverter.julianToCenturiesTxxx(this.JulianTT);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Backwards compatibility property
|
|
89
|
+
get date() {
|
|
90
|
+
return this.UTC;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Static factory methods
|
|
94
|
+
static FromJulianUTC(julian) {
|
|
95
|
+
return new TimeConverter(julian);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
static FromGregorianUTC(date) {
|
|
99
|
+
return new TimeConverter(date);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Convert Julian date to JavaScript Date
|
|
104
|
+
* @param {number} julian - Julian date
|
|
105
|
+
* @return {Date} JavaScript Date object
|
|
106
|
+
*/
|
|
107
|
+
static julianToDateTime(julian) {
|
|
108
|
+
// Using the C# formula: DateTime.FromOADate(julian - JULIAN_UTC)
|
|
109
|
+
// OLE Automation Date is days since Dec 30, 1899
|
|
110
|
+
const daysSince1899 = julian - TimeConverter.JULIAN_UTC;
|
|
111
|
+
const millisSince1899 = daysSince1899 * 86400000; // Convert days to milliseconds
|
|
112
|
+
const date1899 = new Date(Date.UTC(1899, 11, 30, 0, 0, 0, 0)); // Dec 30, 1899
|
|
113
|
+
return new Date(date1899.getTime() + millisSince1899);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Convert Date to Julian date
|
|
118
|
+
* @param {Date} date - JavaScript Date object
|
|
119
|
+
* @return {number} Julian date
|
|
120
|
+
*/
|
|
121
|
+
static dateTimeToJulian(date) {
|
|
122
|
+
// Vallado Fundamentals, Algorithm 14 p. 183
|
|
123
|
+
const year = date.getUTCFullYear();
|
|
124
|
+
const month = date.getUTCMonth() + 1; // JavaScript months are 0-11
|
|
125
|
+
const day = date.getUTCDate();
|
|
126
|
+
const hour = date.getUTCHours();
|
|
127
|
+
const minute = date.getUTCMinutes();
|
|
128
|
+
const second = date.getUTCSeconds();
|
|
129
|
+
const millisecond = date.getUTCMilliseconds();
|
|
130
|
+
|
|
131
|
+
const jd = 367 * year - Math.floor(7 * (year + Math.floor((month + 9) / 12)) / 4)
|
|
132
|
+
+ Math.floor(275 * month / 9) + day + 1721013.5
|
|
133
|
+
+ (((second + millisecond * 1e-3) / 60 + minute) / 60 + hour) / 24;
|
|
134
|
+
|
|
135
|
+
return jd;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Convert Julian date to Modified Julian Date
|
|
140
|
+
* @param {number} julian - Julian date
|
|
141
|
+
* @return {number} Modified Julian Date
|
|
142
|
+
*/
|
|
143
|
+
static JulianToMJD(julian) {
|
|
144
|
+
return julian - TimeConverter.JULIAN_MJD;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Convert Modified Julian Date to Julian date
|
|
149
|
+
* @param {number} mjd - Modified Julian Date
|
|
150
|
+
* @return {number} Julian date
|
|
151
|
+
*/
|
|
152
|
+
static MJDToJulian(mjd) {
|
|
153
|
+
return mjd + TimeConverter.JULIAN_MJD;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Convert TAI to UTC
|
|
158
|
+
* @param {Date} tai - TAI time
|
|
159
|
+
* @return {Date} UTC time
|
|
160
|
+
*/
|
|
161
|
+
static TAIToUTC(tai) {
|
|
162
|
+
const utcMillis = tai.getTime() - (TimeConverter.TAI_UTC * 1000);
|
|
163
|
+
return new Date(utcMillis);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Convert UTC to TAI
|
|
168
|
+
* @param {Date} utc - UTC time
|
|
169
|
+
* @return {Date} TAI time
|
|
170
|
+
*/
|
|
171
|
+
static utcToTAI(utc) {
|
|
172
|
+
const taiMillis = utc.getTime() + (TimeConverter.TAI_UTC * 1000);
|
|
173
|
+
return new Date(taiMillis);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Convert GPS to UTC
|
|
178
|
+
* @param {Date} gps - GPS time
|
|
179
|
+
* @return {Date} UTC time
|
|
180
|
+
*/
|
|
181
|
+
static GPSToUTC(gps) {
|
|
182
|
+
const utcMillis = gps.getTime() - (TimeConverter.GPS_UTC * 1000);
|
|
183
|
+
return new Date(utcMillis);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Convert UTC to GPS
|
|
188
|
+
* @param {Date} utc - UTC time
|
|
189
|
+
* @return {Date} GPS time
|
|
190
|
+
*/
|
|
191
|
+
static utcToGPS(utc) {
|
|
192
|
+
const gpsMillis = utc.getTime() + (TimeConverter.GPS_UTC * 1000);
|
|
193
|
+
return new Date(gpsMillis);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Convert TT to UT1
|
|
198
|
+
* @param {Date} tt - Terrestrial Time
|
|
199
|
+
* @return {Date} UT1 time
|
|
200
|
+
*/
|
|
201
|
+
static TTToUT1(tt) {
|
|
202
|
+
const ut1Millis = tt.getTime() - (TimeConverter.TT_UT1 * 1000);
|
|
203
|
+
return new Date(ut1Millis);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Convert UT1 to TT
|
|
208
|
+
* @param {Date} ut1 - UT1 time
|
|
209
|
+
* @return {Date} Terrestrial Time
|
|
210
|
+
*/
|
|
211
|
+
static ut1ToTT(ut1) {
|
|
212
|
+
const ttMillis = ut1.getTime() + (TimeConverter.TT_UT1 * 1000);
|
|
213
|
+
return new Date(ttMillis);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Convert UT1 to UTC
|
|
218
|
+
* @param {Date} ut1 - UT1 time
|
|
219
|
+
* @return {Date} UTC time
|
|
220
|
+
*/
|
|
221
|
+
static UT1ToUTC(ut1) {
|
|
222
|
+
const utcMillis = ut1.getTime() - (TimeConverter.UT1_UTC * 1000);
|
|
223
|
+
return new Date(utcMillis);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Convert UTC to UT1
|
|
228
|
+
* @param {Date} utc - UTC time
|
|
229
|
+
* @return {Date} UT1 time
|
|
230
|
+
*/
|
|
231
|
+
static utcToUT1(utc) {
|
|
232
|
+
const ut1Millis = utc.getTime() + (TimeConverter.UT1_UTC * 1000);
|
|
233
|
+
return new Date(ut1Millis);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Get Greenwich Mean Sidereal Time from UT1 julian
|
|
238
|
+
* @param {number} jdut1 - Julian date UT1
|
|
239
|
+
* @param {boolean} wrap360 - Whether to wrap to 0-360 degrees
|
|
240
|
+
* @return {Object} Angle object with Radians property
|
|
241
|
+
*/
|
|
242
|
+
static getGMST(jdut1, wrap360 = true) {
|
|
243
|
+
const tut1 = TimeConverter.julianToCenturiesTxxx(jdut1);
|
|
244
|
+
let gmst = -6.2e-6 * tut1 * tut1 * tut1 + 0.093104 * tut1 * tut1
|
|
245
|
+
+ (876600.0 * 3600 + 8640184.812866) * tut1 + 67310.54841; // seconds
|
|
246
|
+
gmst = gmst * (Math.PI / 180) / 240.0 % (2.0 * Math.PI); // 360/86400 = 1/240, to deg, to rad
|
|
247
|
+
|
|
248
|
+
// Check quadrants
|
|
249
|
+
if (gmst < 0.0 && wrap360) {
|
|
250
|
+
gmst += 2.0 * Math.PI;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return {
|
|
254
|
+
Radians: gmst,
|
|
255
|
+
Degrees: gmst * 180 / Math.PI,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Get Local Mean Sidereal Time from longitude and UT1 julian
|
|
261
|
+
* @param {number} lonDeg - Longitude in degrees (-180 to 180)
|
|
262
|
+
* @param {number} jdut1 - Julian date UT1
|
|
263
|
+
* @param {boolean} wrap360 - Whether to wrap to 0-360 degrees
|
|
264
|
+
* @return {Object} Object containing lmst (radians) and gmst (radians)
|
|
265
|
+
*/
|
|
266
|
+
static GetLMST(lonDeg, jdut1, wrap360 = true) {
|
|
267
|
+
const gmstAngle = TimeConverter.getGMST(jdut1, wrap360);
|
|
268
|
+
const gmst = gmstAngle.Radians;
|
|
269
|
+
let lst = lonDeg * Math.PI / 180 + gmst;
|
|
270
|
+
|
|
271
|
+
// Check quadrants
|
|
272
|
+
lst %= 2.0 * Math.PI;
|
|
273
|
+
if (lst < 0.0 && wrap360) {
|
|
274
|
+
lst += 2.0 * Math.PI;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
return {
|
|
278
|
+
lmst: lst,
|
|
279
|
+
gmst: gmst,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Convert Julian date to centuries since J2000
|
|
285
|
+
* @param {number} julian - Julian date
|
|
286
|
+
* @return {number} Centuries since J2000
|
|
287
|
+
*/
|
|
288
|
+
static julianToCenturiesTxxx(julian) {
|
|
289
|
+
return (julian - 2451545.0) / 36525.0;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* RaDec class for Right Ascension and Declination
|
|
295
|
+
*/
|
|
296
|
+
class RaDec {
|
|
297
|
+
constructor(raDeg, decDeg) {
|
|
298
|
+
this.RightAscension = {
|
|
299
|
+
Degrees: raDeg,
|
|
300
|
+
Radians: raDeg * Math.PI / 180,
|
|
301
|
+
};
|
|
302
|
+
this.Declination = {
|
|
303
|
+
Degrees: decDeg,
|
|
304
|
+
Radians: decDeg * Math.PI / 180,
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
export {TimeConverter, RaDec};
|