@saber-usa/node-common 1.7.2 → 1.7.3

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.
@@ -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};