gnss-js 0.0.1 → 0.1.0
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/.prettierrc +5 -0
- package/dist/index.d.mts +68 -48
- package/dist/index.d.ts +68 -48
- package/dist/index.js +311 -284
- package/dist/index.mjs +292 -279
- package/jest.config.js +6 -0
- package/package.json +7 -7
- package/test/functions.test.js +69 -0
- package/test/gnss-scales.test.js +78 -0
- package/test/julian.test.js +41 -0
- package/test/rinex.test.js +11 -0
- package/test/utc.test.js +19 -0
- package/test/index.js +0 -3
package/dist/index.js
CHANGED
|
@@ -20,25 +20,31 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/index.ts
|
|
21
21
|
var src_exports = {};
|
|
22
22
|
__export(src_exports, {
|
|
23
|
-
|
|
23
|
+
DAYS_MJD2000_MJD: () => DAYS_MJD2000_MJD,
|
|
24
|
+
DAYS_MJD_JULIAN: () => DAYS_MJD_JULIAN,
|
|
25
|
+
MILLISECONDS_GPS_TAI: () => MILLISECONDS_GPS_TAI,
|
|
24
26
|
MILLISECONDS_IN_DAY: () => MILLISECONDS_IN_DAY,
|
|
25
27
|
MILLISECONDS_IN_HOUR: () => MILLISECONDS_IN_HOUR,
|
|
26
28
|
MILLISECONDS_IN_MINUTE: () => MILLISECONDS_IN_MINUTE,
|
|
27
29
|
MILLISECONDS_IN_SECOND: () => MILLISECONDS_IN_SECOND,
|
|
28
30
|
MILLISECONDS_IN_WEEK: () => MILLISECONDS_IN_WEEK,
|
|
31
|
+
MILLISECONDS_TT_TAI: () => MILLISECONDS_TT_TAI,
|
|
32
|
+
RINEX_CODES: () => RINEX_CODES,
|
|
29
33
|
SECONDS_IN_DAY: () => SECONDS_IN_DAY,
|
|
30
34
|
SECONDS_IN_HOUR: () => SECONDS_IN_HOUR,
|
|
31
35
|
SECONDS_IN_MINUTE: () => SECONDS_IN_MINUTE,
|
|
32
36
|
SECONDS_IN_WEEK: () => SECONDS_IN_WEEK,
|
|
33
|
-
SECONDS_TT_TAI: () => SECONDS_TT_TAI,
|
|
34
37
|
START_BDS_TIME: () => START_BDS_TIME,
|
|
35
38
|
START_GAL_TIME: () => START_GAL_TIME,
|
|
36
39
|
START_GLO_LEAP: () => START_GLO_LEAP,
|
|
37
40
|
START_GPS_TIME: () => START_GPS_TIME,
|
|
38
41
|
START_JULIAN_CALENDAR_UNIX_SECONDS: () => START_JULIAN_CALENDAR_UNIX_SECONDS,
|
|
42
|
+
START_JULIAN_TAI: () => START_JULIAN_TAI,
|
|
39
43
|
START_LEAP_SECS_GPS: () => START_LEAP_SECS_GPS,
|
|
40
44
|
START_MJD2000_TIME: () => START_MJD2000_TIME,
|
|
41
45
|
START_MJD_UNIX_SECONDS: () => START_MJD_UNIX_SECONDS,
|
|
46
|
+
START_NTP_TIME: () => START_NTP_TIME,
|
|
47
|
+
START_TAI_TIME: () => START_TAI_TIME,
|
|
42
48
|
START_UNIX_TIME: () => START_UNIX_TIME,
|
|
43
49
|
getBdsTime: () => getBdsTime,
|
|
44
50
|
getDateFromBdsTime: () => getDateFromBdsTime,
|
|
@@ -53,6 +59,8 @@ __export(src_exports, {
|
|
|
53
59
|
getDateFromMJD: () => getDateFromMJD,
|
|
54
60
|
getDateFromMJD2000: () => getDateFromMJD2000,
|
|
55
61
|
getDateFromRINEX: () => getDateFromRINEX,
|
|
62
|
+
getDateFromTAI: () => getDateFromTAI,
|
|
63
|
+
getDateFromTT: () => getDateFromTT,
|
|
56
64
|
getDateFromTimeOfDay: () => getDateFromTimeOfDay,
|
|
57
65
|
getDateFromUnixTime: () => getDateFromUnixTime,
|
|
58
66
|
getDayOfWeek: () => getDayOfWeek,
|
|
@@ -60,16 +68,20 @@ __export(src_exports, {
|
|
|
60
68
|
getGalTime: () => getGalTime,
|
|
61
69
|
getGloN4: () => getGloN4,
|
|
62
70
|
getGloNA: () => getGloNA,
|
|
71
|
+
getGpsLeap: () => getGpsLeap,
|
|
63
72
|
getGpsTime: () => getGpsTime,
|
|
64
73
|
getHourCode: () => getHourCode,
|
|
65
74
|
getHoursFromTimeDifference: () => getHoursFromTimeDifference,
|
|
66
75
|
getJulianDate: () => getJulianDate,
|
|
67
|
-
|
|
68
|
-
getLeapSecondsFromTAI: () => getLeapSecondsFromTAI,
|
|
76
|
+
getLeap: () => getLeap,
|
|
69
77
|
getMJD: () => getMJD,
|
|
78
|
+
getMJD2000: () => getMJD2000,
|
|
70
79
|
getMinutesFromTimeDifference: () => getMinutesFromTimeDifference,
|
|
80
|
+
getNtpTime: () => getNtpTime,
|
|
71
81
|
getRINEX: () => getRINEX,
|
|
72
82
|
getSecondsFromTimeDifference: () => getSecondsFromTimeDifference,
|
|
83
|
+
getTAIDate: () => getTAIDate,
|
|
84
|
+
getTTDate: () => getTTDate,
|
|
73
85
|
getTimeDifference: () => getTimeDifference,
|
|
74
86
|
getTimeDifferenceFromDays: () => getTimeDifferenceFromDays,
|
|
75
87
|
getTimeDifferenceFromHours: () => getTimeDifferenceFromHours,
|
|
@@ -80,11 +92,13 @@ __export(src_exports, {
|
|
|
80
92
|
getTimeOfWeek: () => getTimeOfWeek,
|
|
81
93
|
getTotalDaysFromTimeDifference: () => getTotalDaysFromTimeDifference,
|
|
82
94
|
getUnixTime: () => getUnixTime,
|
|
83
|
-
|
|
95
|
+
getUtcDate: () => getUtcDate,
|
|
96
|
+
getWeekNumber: () => getWeekNumber,
|
|
97
|
+
getWeekOfYear: () => getWeekOfYear
|
|
84
98
|
});
|
|
85
99
|
module.exports = __toCommonJS(src_exports);
|
|
86
100
|
|
|
87
|
-
// src/constants.ts
|
|
101
|
+
// src/constants/time.ts
|
|
88
102
|
var SECONDS_IN_WEEK = 604800;
|
|
89
103
|
var SECONDS_IN_DAY = 86400;
|
|
90
104
|
var SECONDS_IN_HOUR = 3600;
|
|
@@ -94,140 +108,59 @@ var MILLISECONDS_IN_DAY = 864e5;
|
|
|
94
108
|
var MILLISECONDS_IN_HOUR = 36e5;
|
|
95
109
|
var MILLISECONDS_IN_MINUTE = 6e4;
|
|
96
110
|
var MILLISECONDS_IN_SECOND = 1e3;
|
|
97
|
-
var
|
|
111
|
+
var MILLISECONDS_TT_TAI = 32184;
|
|
112
|
+
var MILLISECONDS_GPS_TAI = 19e3;
|
|
98
113
|
var START_LEAP_SECS_GPS = 19;
|
|
99
|
-
var START_GPS_TIME = new Date(
|
|
100
|
-
var START_GAL_TIME = new Date(
|
|
101
|
-
var START_BDS_TIME = new Date(
|
|
102
|
-
var START_UNIX_TIME = new Date(
|
|
103
|
-
var
|
|
104
|
-
var
|
|
105
|
-
var
|
|
114
|
+
var START_GPS_TIME = /* @__PURE__ */ new Date("1980-01-06T00:00:00Z");
|
|
115
|
+
var START_GAL_TIME = /* @__PURE__ */ new Date("1999-08-22T00:00:00Z");
|
|
116
|
+
var START_BDS_TIME = /* @__PURE__ */ new Date("2006-01-01T00:00:00Z");
|
|
117
|
+
var START_UNIX_TIME = /* @__PURE__ */ new Date("1970-01-01T00:00:00Z");
|
|
118
|
+
var START_NTP_TIME = /* @__PURE__ */ new Date("1900-01-01T00:00:00Z");
|
|
119
|
+
var START_GLO_LEAP = /* @__PURE__ */ new Date("1996-01-01T00:00:00Z");
|
|
120
|
+
var START_MJD2000_TIME = /* @__PURE__ */ new Date("2000-01-01T00:00:00Z");
|
|
121
|
+
var START_TAI_TIME = /* @__PURE__ */ new Date("1957-12-31T23:59:41Z");
|
|
122
|
+
var RINEX_CODES = [
|
|
123
|
+
"a",
|
|
124
|
+
"b",
|
|
125
|
+
"c",
|
|
126
|
+
"d",
|
|
127
|
+
"e",
|
|
128
|
+
"f",
|
|
129
|
+
"g",
|
|
130
|
+
"h",
|
|
131
|
+
"i",
|
|
132
|
+
"j",
|
|
133
|
+
"k",
|
|
134
|
+
"l",
|
|
135
|
+
"m",
|
|
136
|
+
"n",
|
|
137
|
+
"o",
|
|
138
|
+
"p",
|
|
139
|
+
"q",
|
|
140
|
+
"r",
|
|
141
|
+
"s",
|
|
142
|
+
"t",
|
|
143
|
+
"u",
|
|
144
|
+
"v",
|
|
145
|
+
"w",
|
|
146
|
+
"x"
|
|
147
|
+
];
|
|
106
148
|
var START_JULIAN_CALENDAR_UNIX_SECONDS = 24405875e-1;
|
|
149
|
+
var START_JULIAN_TAI = 24362045e-1;
|
|
150
|
+
var DAYS_MJD_JULIAN = 24000005e-1;
|
|
151
|
+
var DAYS_MJD2000_MJD = 51544.5;
|
|
107
152
|
var START_MJD_UNIX_SECONDS = 40587;
|
|
108
153
|
|
|
109
|
-
// src/functions.ts
|
|
110
|
-
function isValidDate(d) {
|
|
111
|
-
return d instanceof Date && !Number.isNaN(d);
|
|
112
|
-
}
|
|
113
|
-
function getLeapSeconds(date) {
|
|
114
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 36922176e5) {
|
|
115
|
-
return 37;
|
|
116
|
-
}
|
|
117
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 36446976e5) {
|
|
118
|
-
return 36;
|
|
119
|
-
}
|
|
120
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 35500896e5) {
|
|
121
|
-
return 35;
|
|
122
|
-
}
|
|
123
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 34397568e5) {
|
|
124
|
-
return 34;
|
|
125
|
-
}
|
|
126
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 33450624e5) {
|
|
127
|
-
return 33;
|
|
128
|
-
}
|
|
129
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 31241376e5) {
|
|
130
|
-
return 32;
|
|
131
|
-
}
|
|
132
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 3076704e6) {
|
|
133
|
-
return 31;
|
|
134
|
-
}
|
|
135
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 30294432e5) {
|
|
136
|
-
return 30;
|
|
137
|
-
}
|
|
138
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 29820096e5) {
|
|
139
|
-
return 29;
|
|
140
|
-
}
|
|
141
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 29504736e5) {
|
|
142
|
-
return 28;
|
|
143
|
-
}
|
|
144
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 29189376e5) {
|
|
145
|
-
return 27;
|
|
146
|
-
}
|
|
147
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 28716768e5) {
|
|
148
|
-
return 26;
|
|
149
|
-
}
|
|
150
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 28401408e5) {
|
|
151
|
-
return 25;
|
|
152
|
-
}
|
|
153
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 27769824e5) {
|
|
154
|
-
return 24;
|
|
155
|
-
}
|
|
156
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 26980128e5) {
|
|
157
|
-
return 23;
|
|
158
|
-
}
|
|
159
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 26348544e5) {
|
|
160
|
-
return 22;
|
|
161
|
-
}
|
|
162
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 26033184e5) {
|
|
163
|
-
return 21;
|
|
164
|
-
}
|
|
165
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 25717824e5) {
|
|
166
|
-
return 20;
|
|
167
|
-
}
|
|
168
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 25245216e5) {
|
|
169
|
-
return 19;
|
|
170
|
-
}
|
|
171
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 24929856e5) {
|
|
172
|
-
return 18;
|
|
173
|
-
}
|
|
174
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 24614496e5) {
|
|
175
|
-
return 17;
|
|
176
|
-
}
|
|
177
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 24299136e5) {
|
|
178
|
-
return 16;
|
|
179
|
-
}
|
|
180
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 23982912e5) {
|
|
181
|
-
return 15;
|
|
182
|
-
}
|
|
183
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 23667552e5) {
|
|
184
|
-
return 14;
|
|
185
|
-
}
|
|
186
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 23352192e5) {
|
|
187
|
-
return 13;
|
|
188
|
-
}
|
|
189
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 23036832e5) {
|
|
190
|
-
return 12;
|
|
191
|
-
}
|
|
192
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 22877856e5) {
|
|
193
|
-
return 11;
|
|
194
|
-
}
|
|
195
|
-
if (date.getTime() >= Date.UTC(1900, 0, 1) + 22720608e5) {
|
|
196
|
-
return 10;
|
|
197
|
-
}
|
|
198
|
-
return 0;
|
|
199
|
-
}
|
|
200
|
-
function getGpsTime(date) {
|
|
201
|
-
return date.getTime() - START_GPS_TIME.getTime();
|
|
202
|
-
}
|
|
203
|
-
function getGalTime(date) {
|
|
204
|
-
return date.getTime() - START_GAL_TIME.getTime();
|
|
205
|
-
}
|
|
206
|
-
function getBdsTime(date) {
|
|
207
|
-
return date.getTime() - START_BDS_TIME.getTime();
|
|
208
|
-
}
|
|
209
|
-
function getUnixTime(date) {
|
|
210
|
-
return date.getTime() - START_UNIX_TIME.getTime();
|
|
211
|
-
}
|
|
212
|
-
function getWeekNumber(date) {
|
|
213
|
-
return Math.floor(getGpsTime(date) / MILLISECONDS_IN_WEEK);
|
|
214
|
-
}
|
|
215
|
-
function getTimeOfWeek(date) {
|
|
216
|
-
return Math.floor(
|
|
217
|
-
getGpsTime(date) % MILLISECONDS_IN_WEEK / MILLISECONDS_IN_SECOND
|
|
218
|
-
);
|
|
219
|
-
}
|
|
154
|
+
// src/time/functions.ts
|
|
220
155
|
function getTimeOfDay(date) {
|
|
221
|
-
return
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
)) / MILLISECONDS_IN_SECOND
|
|
230
|
-
);
|
|
156
|
+
return (date.getTime() - Date.UTC(
|
|
157
|
+
date.getUTCFullYear(),
|
|
158
|
+
date.getUTCMonth(),
|
|
159
|
+
date.getUTCDate(),
|
|
160
|
+
0,
|
|
161
|
+
0,
|
|
162
|
+
0
|
|
163
|
+
)) / MILLISECONDS_IN_SECOND;
|
|
231
164
|
}
|
|
232
165
|
function getDateFromTimeOfDay(timeOfDay, dateRaw) {
|
|
233
166
|
const date = new Date(
|
|
@@ -240,68 +173,12 @@ function getDateFromTimeOfDay(timeOfDay, dateRaw) {
|
|
|
240
173
|
0
|
|
241
174
|
) + timeOfDay * MILLISECONDS_IN_SECOND
|
|
242
175
|
);
|
|
243
|
-
if (!isValidDate(date))
|
|
244
|
-
return void 0;
|
|
245
176
|
return date;
|
|
246
177
|
}
|
|
247
|
-
function
|
|
248
|
-
return Math.floor(
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
const n4 = getGloN4(date);
|
|
252
|
-
const init4YearPeriod = new Date(START_GLO_LEAP);
|
|
253
|
-
init4YearPeriod.setUTCFullYear(init4YearPeriod.getUTCFullYear() + n4 * 4);
|
|
254
|
-
return Math.floor(getTimeDifference(init4YearPeriod, date) / MILLISECONDS_IN_DAY) + 1;
|
|
255
|
-
}
|
|
256
|
-
function getDateFromGpsData(weekNumber, timeOfWeek) {
|
|
257
|
-
const date = new Date(
|
|
258
|
-
weekNumber * MILLISECONDS_IN_WEEK + timeOfWeek * MILLISECONDS_IN_SECOND + START_GPS_TIME.getTime()
|
|
259
|
-
);
|
|
260
|
-
if (!isValidDate(date))
|
|
261
|
-
return void 0;
|
|
262
|
-
return date;
|
|
263
|
-
}
|
|
264
|
-
function getDateFromGpsTime(gpsTime) {
|
|
265
|
-
const date = new Date(
|
|
266
|
-
gpsTime * MILLISECONDS_IN_SECOND + START_GPS_TIME.getTime()
|
|
267
|
-
);
|
|
268
|
-
if (!isValidDate(date))
|
|
269
|
-
return void 0;
|
|
270
|
-
return date;
|
|
271
|
-
}
|
|
272
|
-
function getDateFromGalTime(galTime) {
|
|
273
|
-
const date = new Date(
|
|
274
|
-
galTime * MILLISECONDS_IN_SECOND + START_GAL_TIME.getTime()
|
|
275
|
-
);
|
|
276
|
-
if (!isValidDate(date))
|
|
277
|
-
return void 0;
|
|
278
|
-
return date;
|
|
279
|
-
}
|
|
280
|
-
function getDateFromBdsTime(bdsTime) {
|
|
281
|
-
const date = new Date(
|
|
282
|
-
bdsTime * MILLISECONDS_IN_SECOND + START_BDS_TIME.getTime()
|
|
283
|
-
);
|
|
284
|
-
if (!isValidDate(date))
|
|
285
|
-
return void 0;
|
|
286
|
-
return date;
|
|
287
|
-
}
|
|
288
|
-
function getDateFromUnixTime(unixTime) {
|
|
289
|
-
const date = new Date(
|
|
290
|
-
unixTime * MILLISECONDS_IN_SECOND + START_UNIX_TIME.getTime()
|
|
291
|
-
);
|
|
292
|
-
if (!isValidDate(date))
|
|
293
|
-
return void 0;
|
|
294
|
-
return date;
|
|
295
|
-
}
|
|
296
|
-
function getDateFromGloN(n4, na, tod) {
|
|
297
|
-
const date = new Date(START_GLO_LEAP);
|
|
298
|
-
date.setFullYear(date.getUTCFullYear() + n4 * 4);
|
|
299
|
-
date.setTime(
|
|
300
|
-
date.getTime() + (na - 1) * MILLISECONDS_IN_DAY + tod * MILLISECONDS_IN_SECOND
|
|
301
|
-
);
|
|
302
|
-
if (!isValidDate(date))
|
|
303
|
-
return void 0;
|
|
304
|
-
return date;
|
|
178
|
+
function getDayOfYear(date) {
|
|
179
|
+
return Math.floor(
|
|
180
|
+
(date.getTime() - Date.UTC(date.getUTCFullYear())) / MILLISECONDS_IN_DAY
|
|
181
|
+
) + 1;
|
|
305
182
|
}
|
|
306
183
|
function getDateFromDayOfYear(dayOfYear, date) {
|
|
307
184
|
return new Date(
|
|
@@ -316,121 +193,58 @@ function getDateFromDayOfYear(dayOfYear, date) {
|
|
|
316
193
|
) + (dayOfYear - 1) * MILLISECONDS_IN_DAY
|
|
317
194
|
);
|
|
318
195
|
}
|
|
319
|
-
function getDayOfYear(date) {
|
|
320
|
-
return Math.floor(
|
|
321
|
-
(date.getTime() - Date.UTC(date.getUTCFullYear())) / MILLISECONDS_IN_DAY
|
|
322
|
-
) + 1;
|
|
323
|
-
}
|
|
324
196
|
function getDayOfWeek(date) {
|
|
325
197
|
return date.getUTCDay();
|
|
326
198
|
}
|
|
327
199
|
function getDateFromDayOfWeek(dayOfWeek, dateRaw) {
|
|
328
200
|
if (dayOfWeek < 0 || dayOfWeek > 6)
|
|
329
201
|
throw new Error("Day of week must be a value between 0 and 7");
|
|
330
|
-
|
|
202
|
+
return new Date(
|
|
331
203
|
dateRaw.getTime() + (dayOfWeek - dateRaw.getUTCDay()) * MILLISECONDS_IN_DAY
|
|
332
204
|
);
|
|
333
|
-
if (!isValidDate(date))
|
|
334
|
-
return void 0;
|
|
335
|
-
return date;
|
|
336
205
|
}
|
|
337
206
|
function getDateFromHourCode(hourCode, date) {
|
|
338
|
-
const hour =
|
|
339
|
-
if (hour
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
return void 0;
|
|
207
|
+
const hour = RINEX_CODES.indexOf(hourCode);
|
|
208
|
+
if (hour === -1)
|
|
209
|
+
throw new Error("Hour code must be a lowercase letter between a and x");
|
|
210
|
+
const newDate = new Date(date.getTime());
|
|
211
|
+
newDate.setUTCHours(hour);
|
|
212
|
+
return newDate;
|
|
345
213
|
}
|
|
346
214
|
function getHourCode(date) {
|
|
347
|
-
return
|
|
348
|
-
}
|
|
349
|
-
function getJulianDate(date) {
|
|
350
|
-
return date.getTime() / MILLISECONDS_IN_DAY + START_JULIAN_CALENDAR_UNIX_SECONDS;
|
|
215
|
+
return RINEX_CODES[date.getUTCHours()];
|
|
351
216
|
}
|
|
352
|
-
function
|
|
353
|
-
const
|
|
354
|
-
(
|
|
217
|
+
function getWeekOfYear(date) {
|
|
218
|
+
const target = new Date(
|
|
219
|
+
Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())
|
|
355
220
|
);
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
return date.getTime() / MILLISECONDS_IN_DAY + START_MJD_UNIX_SECONDS;
|
|
362
|
-
}
|
|
363
|
-
function getDateFromMJD(mjd) {
|
|
364
|
-
if (Number.isNaN(mjd))
|
|
365
|
-
return void 0;
|
|
366
|
-
const date = new Date((mjd - START_MJD_UNIX_SECONDS) * MILLISECONDS_IN_DAY);
|
|
367
|
-
if (!isValidDate(date))
|
|
368
|
-
return void 0;
|
|
369
|
-
return date;
|
|
370
|
-
}
|
|
371
|
-
function getDateFromMJD2000(mjd2000) {
|
|
372
|
-
const date = new Date(
|
|
373
|
-
(mjd2000 - START_MJD_UNIX_SECONDS + 51544) * MILLISECONDS_IN_DAY
|
|
374
|
-
);
|
|
375
|
-
if (!isValidDate(date))
|
|
376
|
-
return void 0;
|
|
377
|
-
return date;
|
|
378
|
-
}
|
|
379
|
-
function getDateFromRINEX(rinex) {
|
|
380
|
-
const year = Number.parseInt(rinex.substring(2, 6));
|
|
381
|
-
const month = Number.parseInt(rinex.substring(7, 9)) - 1;
|
|
382
|
-
const day = Number.parseInt(rinex.substring(10, 12));
|
|
383
|
-
const hour = Number.parseInt(rinex.substring(13, 15));
|
|
384
|
-
const minute = Number.parseInt(rinex.substring(16, 18));
|
|
385
|
-
const second = Number.parseInt(rinex.substring(19, 21));
|
|
386
|
-
const millisecond = Number.parseInt(rinex.substring(22, 29)) / 1e4;
|
|
387
|
-
const date = new Date(
|
|
388
|
-
Date.UTC(year, month, day, hour, minute, second, millisecond)
|
|
389
|
-
);
|
|
390
|
-
if (!isValidDate(date))
|
|
391
|
-
return void 0;
|
|
392
|
-
return date;
|
|
393
|
-
}
|
|
394
|
-
function getLeapSecondsFromTAI(date) {
|
|
395
|
-
const leapsTAI = getLeapSeconds(date);
|
|
396
|
-
const dateUTC = new Date(date.getTime() - leapsTAI * MILLISECONDS_IN_SECOND);
|
|
397
|
-
const leapsUTC = getLeapSeconds(dateUTC);
|
|
398
|
-
const dateTAI = new Date(date.getTime() + leapsUTC * MILLISECONDS_IN_SECOND);
|
|
399
|
-
if (dateTAI.getTime() === date.getTime()) {
|
|
400
|
-
return leapsTAI;
|
|
401
|
-
}
|
|
402
|
-
if (dateTAI.getTime() < date.getTime()) {
|
|
403
|
-
return leapsTAI - 1;
|
|
404
|
-
}
|
|
405
|
-
return 0;
|
|
221
|
+
const dayNr = (target.getUTCDay() + 6) % 7;
|
|
222
|
+
target.setUTCDate(target.getUTCDate() - dayNr + 3);
|
|
223
|
+
const firstThursday = new Date(Date.UTC(target.getUTCFullYear(), 0, 4));
|
|
224
|
+
const dayDiff = (target.getTime() - firstThursday.getTime()) / (86400 * 1e3);
|
|
225
|
+
return 1 + Math.floor(dayDiff / 7) + 1;
|
|
406
226
|
}
|
|
227
|
+
|
|
228
|
+
// src/time/time-difference.ts
|
|
407
229
|
function getTimeDifference(startDate, finalDate) {
|
|
408
230
|
return Math.floor(finalDate.getTime() - startDate.getTime());
|
|
409
231
|
}
|
|
410
232
|
function getSecondsFromTimeDifference(timeDifference) {
|
|
411
|
-
if (Number.isNaN(timeDifference))
|
|
412
|
-
return void 0;
|
|
413
233
|
return Math.floor(
|
|
414
234
|
timeDifference % MILLISECONDS_IN_MINUTE / MILLISECONDS_IN_SECOND
|
|
415
235
|
);
|
|
416
236
|
}
|
|
417
237
|
function getMinutesFromTimeDifference(timeDifference) {
|
|
418
|
-
if (Number.isNaN(timeDifference))
|
|
419
|
-
return void 0;
|
|
420
238
|
return Math.floor(
|
|
421
239
|
timeDifference % MILLISECONDS_IN_HOUR / MILLISECONDS_IN_MINUTE
|
|
422
240
|
);
|
|
423
241
|
}
|
|
424
242
|
function getHoursFromTimeDifference(timeDifference) {
|
|
425
|
-
if (Number.isNaN(timeDifference))
|
|
426
|
-
return void 0;
|
|
427
243
|
return Math.floor(
|
|
428
244
|
timeDifference % MILLISECONDS_IN_DAY / MILLISECONDS_IN_HOUR
|
|
429
245
|
);
|
|
430
246
|
}
|
|
431
247
|
function getTotalDaysFromTimeDifference(timeDifference) {
|
|
432
|
-
if (Number.isNaN(timeDifference))
|
|
433
|
-
return void 0;
|
|
434
248
|
return Math.floor(timeDifference / MILLISECONDS_IN_DAY);
|
|
435
249
|
}
|
|
436
250
|
function getTimeDifferenceFromSeconds(seconds) {
|
|
@@ -447,34 +261,239 @@ function getTimeDifferenceFromDays(days) {
|
|
|
447
261
|
}
|
|
448
262
|
function getTimeDifferenceFromObject(timeDifferenceObject) {
|
|
449
263
|
const { seconds, minutes, hours, days } = timeDifferenceObject;
|
|
450
|
-
if (Number.isNaN(seconds) || Number.isNaN(minutes) || Number.isNaN(hours) || Number.isNaN(days))
|
|
451
|
-
return void 0;
|
|
452
264
|
return getTimeDifferenceFromSeconds(seconds) + getTimeDifferenceFromMinutes(minutes) + getTimeDifferenceFromHours(hours) + getTimeDifferenceFromDays(days);
|
|
453
265
|
}
|
|
266
|
+
|
|
267
|
+
// src/time/gnss.ts
|
|
268
|
+
function getGpsTime(date) {
|
|
269
|
+
return date.getTime() - START_GPS_TIME.getTime();
|
|
270
|
+
}
|
|
271
|
+
function getDateFromGpsTime(gpsTime) {
|
|
272
|
+
return new Date(gpsTime + START_GPS_TIME.getTime());
|
|
273
|
+
}
|
|
274
|
+
function getGalTime(date) {
|
|
275
|
+
return date.getTime() - START_GAL_TIME.getTime();
|
|
276
|
+
}
|
|
277
|
+
function getDateFromGalTime(galTime) {
|
|
278
|
+
return new Date(galTime + START_GAL_TIME.getTime());
|
|
279
|
+
}
|
|
280
|
+
function getBdsTime(date) {
|
|
281
|
+
return date.getTime() - START_BDS_TIME.getTime();
|
|
282
|
+
}
|
|
283
|
+
function getDateFromBdsTime(bdsTime) {
|
|
284
|
+
return new Date(bdsTime + START_BDS_TIME.getTime());
|
|
285
|
+
}
|
|
286
|
+
function getUnixTime(date) {
|
|
287
|
+
return date.getTime() - START_UNIX_TIME.getTime();
|
|
288
|
+
}
|
|
289
|
+
function getDateFromUnixTime(unixTime) {
|
|
290
|
+
return new Date(unixTime + START_UNIX_TIME.getTime());
|
|
291
|
+
}
|
|
292
|
+
function getWeekNumber(date) {
|
|
293
|
+
return Math.floor(getGpsTime(date) / MILLISECONDS_IN_WEEK);
|
|
294
|
+
}
|
|
295
|
+
function getTimeOfWeek(date) {
|
|
296
|
+
return getGpsTime(date) % MILLISECONDS_IN_WEEK / MILLISECONDS_IN_SECOND;
|
|
297
|
+
}
|
|
298
|
+
function getDateFromGpsData(weekNumber, timeOfWeek) {
|
|
299
|
+
return new Date(
|
|
300
|
+
weekNumber * MILLISECONDS_IN_WEEK + timeOfWeek * MILLISECONDS_IN_SECOND + START_GPS_TIME.getTime()
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
function getTAIDate(date) {
|
|
304
|
+
return new Date(date.getTime() + MILLISECONDS_GPS_TAI);
|
|
305
|
+
}
|
|
306
|
+
function getDateFromTAI(tai_date) {
|
|
307
|
+
return new Date(tai_date.getTime() - MILLISECONDS_GPS_TAI);
|
|
308
|
+
}
|
|
309
|
+
function getTTDate(date) {
|
|
310
|
+
return new Date(date.getTime() + MILLISECONDS_GPS_TAI + MILLISECONDS_TT_TAI);
|
|
311
|
+
}
|
|
312
|
+
function getDateFromTT(tt_date) {
|
|
313
|
+
return new Date(
|
|
314
|
+
tt_date.getTime() - MILLISECONDS_GPS_TAI - MILLISECONDS_TT_TAI
|
|
315
|
+
);
|
|
316
|
+
}
|
|
317
|
+
function getGloN4(date) {
|
|
318
|
+
return Math.floor((date.getUTCFullYear() - START_GLO_LEAP.getFullYear()) / 4);
|
|
319
|
+
}
|
|
320
|
+
function getGloNA(date) {
|
|
321
|
+
const n4 = getGloN4(date);
|
|
322
|
+
const init4YearPeriod = new Date(START_GLO_LEAP);
|
|
323
|
+
init4YearPeriod.setUTCFullYear(init4YearPeriod.getUTCFullYear() + n4 * 4);
|
|
324
|
+
return Math.floor(getTimeDifference(init4YearPeriod, date) / MILLISECONDS_IN_DAY) + 1;
|
|
325
|
+
}
|
|
326
|
+
function getDateFromGloN(n4, na, tod) {
|
|
327
|
+
const date = new Date(START_GLO_LEAP);
|
|
328
|
+
date.setFullYear(date.getUTCFullYear() + n4 * 4);
|
|
329
|
+
date.setTime(
|
|
330
|
+
date.getTime() + (na - 1) * MILLISECONDS_IN_DAY + tod * MILLISECONDS_IN_SECOND
|
|
331
|
+
);
|
|
332
|
+
return date;
|
|
333
|
+
}
|
|
334
|
+
function getNtpTime(date) {
|
|
335
|
+
return getTAIDate(date).getTime() - START_NTP_TIME.getTime();
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// src/time/rinex.ts
|
|
454
339
|
function getRINEX(date) {
|
|
455
|
-
|
|
340
|
+
const seconds = date.getUTCSeconds();
|
|
341
|
+
const milliseconds = date.getUTCMilliseconds();
|
|
342
|
+
const fractionalSeconds = (milliseconds / MILLISECONDS_IN_SECOND).toFixed(7).slice(1);
|
|
343
|
+
const formatted = `> ${date.getUTCFullYear()} ${String(
|
|
344
|
+
date.getUTCMonth() + 1
|
|
345
|
+
).padStart(2, "0")} ${String(date.getUTCDate()).padStart(2, "0")} ${String(
|
|
346
|
+
date.getUTCHours()
|
|
347
|
+
).padStart(2, "0")} ${String(date.getUTCMinutes()).padStart(
|
|
348
|
+
2,
|
|
349
|
+
"0"
|
|
350
|
+
)} ${String(seconds).padStart(2, "0")}${fractionalSeconds}`;
|
|
351
|
+
return formatted;
|
|
352
|
+
}
|
|
353
|
+
function getDateFromRINEX(rinex) {
|
|
354
|
+
const year = Number.parseInt(rinex.substring(2, 6));
|
|
355
|
+
const month = Number.parseInt(rinex.substring(7, 9)) - 1;
|
|
356
|
+
const day = Number.parseInt(rinex.substring(10, 12));
|
|
357
|
+
const hour = Number.parseInt(rinex.substring(13, 15));
|
|
358
|
+
const minute = Number.parseInt(rinex.substring(16, 18));
|
|
359
|
+
const second = Number.parseInt(rinex.substring(19, 21));
|
|
360
|
+
const millisecond = Number.parseInt(rinex.substring(22, 29)) / 1e4;
|
|
361
|
+
const date = new Date(
|
|
362
|
+
Date.UTC(year, month, day, hour, minute, second, millisecond)
|
|
363
|
+
);
|
|
364
|
+
return date;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// src/time/utc.ts
|
|
368
|
+
function getLeap(date) {
|
|
369
|
+
const ntp_time = getNtpTime(date);
|
|
370
|
+
const leapSecondsMap = {
|
|
371
|
+
2272060800: 10,
|
|
372
|
+
// 1 Jan 1972
|
|
373
|
+
2287785600: 11,
|
|
374
|
+
// 1 Jul 1972
|
|
375
|
+
2303683200: 12,
|
|
376
|
+
// 1 Jan 1973
|
|
377
|
+
2335219200: 13,
|
|
378
|
+
// 1 Jan 1974
|
|
379
|
+
2366755200: 14,
|
|
380
|
+
// 1 Jan 1975
|
|
381
|
+
2398291200: 15,
|
|
382
|
+
// 1 Jan 1976
|
|
383
|
+
2429913600: 16,
|
|
384
|
+
// 1 Jan 1977
|
|
385
|
+
2461449600: 17,
|
|
386
|
+
// 1 Jan 1978
|
|
387
|
+
2492985600: 18,
|
|
388
|
+
// 1 Jan 1979
|
|
389
|
+
2524521600: 19,
|
|
390
|
+
// 1 Jan 1980
|
|
391
|
+
2571782400: 20,
|
|
392
|
+
// 1 Jul 1981
|
|
393
|
+
2603318400: 21,
|
|
394
|
+
// 1 Jul 1982
|
|
395
|
+
2634854400: 22,
|
|
396
|
+
// 1 Jul 1983
|
|
397
|
+
2698012800: 23,
|
|
398
|
+
// 1 Jul 1985
|
|
399
|
+
2776982400: 24,
|
|
400
|
+
// 1 Jan 1988
|
|
401
|
+
2840140800: 25,
|
|
402
|
+
// 1 Jan 1990
|
|
403
|
+
2871676800: 26,
|
|
404
|
+
// 1 Jan 1991
|
|
405
|
+
2918937600: 27,
|
|
406
|
+
// 1 Jul 1992
|
|
407
|
+
2950473600: 28,
|
|
408
|
+
// 1 Jul 1993
|
|
409
|
+
2982009600: 29,
|
|
410
|
+
// 1 Jul 1994
|
|
411
|
+
3029443200: 30,
|
|
412
|
+
// 1 Jan 1996
|
|
413
|
+
3076704e3: 31,
|
|
414
|
+
// 1 Jul 1997
|
|
415
|
+
3124137600: 32,
|
|
416
|
+
// 1 Jan 1999
|
|
417
|
+
3345062400: 33,
|
|
418
|
+
// 1 Jan 2006
|
|
419
|
+
3439756800: 34,
|
|
420
|
+
// 1 Jan 2009
|
|
421
|
+
3550089600: 35,
|
|
422
|
+
// 1 Jul 2012
|
|
423
|
+
3644697600: 36,
|
|
424
|
+
// 1 Jul 2015
|
|
425
|
+
3692217600: 37
|
|
426
|
+
// 1 Jan 2017
|
|
427
|
+
};
|
|
428
|
+
for (const [timestamp, leapSeconds] of Object.entries(
|
|
429
|
+
leapSecondsMap
|
|
430
|
+
).reverse()) {
|
|
431
|
+
if (ntp_time / MILLISECONDS_IN_SECOND - leapSeconds >= Number(timestamp)) {
|
|
432
|
+
return leapSeconds;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
return 0;
|
|
436
|
+
}
|
|
437
|
+
function getGpsLeap(date) {
|
|
438
|
+
const leap_seconds = getLeap(date);
|
|
439
|
+
if (leap_seconds < 0)
|
|
440
|
+
return 0;
|
|
441
|
+
return leap_seconds - 19;
|
|
442
|
+
}
|
|
443
|
+
function getUtcDate(date) {
|
|
444
|
+
const tai_date = getTAIDate(date);
|
|
445
|
+
const leap_seconds = getLeap(date);
|
|
446
|
+
return new Date(tai_date.getTime() - leap_seconds * MILLISECONDS_IN_SECOND);
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
// src/time/julian.ts
|
|
450
|
+
function getJulianDate(date) {
|
|
451
|
+
return (date.getTime() - START_TAI_TIME.getTime()) / MILLISECONDS_IN_DAY + START_JULIAN_TAI;
|
|
452
|
+
}
|
|
453
|
+
function getDateFromJulianDate(julianDate) {
|
|
454
|
+
return new Date(
|
|
455
|
+
(julianDate - 24362045e-1) * MILLISECONDS_IN_DAY + START_TAI_TIME.getTime()
|
|
456
|
+
);
|
|
457
|
+
}
|
|
458
|
+
function getMJD(date) {
|
|
459
|
+
return getJulianDate(date) - DAYS_MJD_JULIAN;
|
|
460
|
+
}
|
|
461
|
+
function getDateFromMJD(mjd) {
|
|
462
|
+
return getDateFromJulianDate(mjd + DAYS_MJD_JULIAN);
|
|
463
|
+
}
|
|
464
|
+
function getMJD2000(date) {
|
|
465
|
+
return getMJD(date) - DAYS_MJD2000_MJD;
|
|
466
|
+
}
|
|
467
|
+
function getDateFromMJD2000(mjd2000) {
|
|
468
|
+
return getDateFromMJD(mjd2000 + DAYS_MJD2000_MJD);
|
|
456
469
|
}
|
|
457
470
|
// Annotate the CommonJS export names for ESM import in node:
|
|
458
471
|
0 && (module.exports = {
|
|
459
|
-
|
|
472
|
+
DAYS_MJD2000_MJD,
|
|
473
|
+
DAYS_MJD_JULIAN,
|
|
474
|
+
MILLISECONDS_GPS_TAI,
|
|
460
475
|
MILLISECONDS_IN_DAY,
|
|
461
476
|
MILLISECONDS_IN_HOUR,
|
|
462
477
|
MILLISECONDS_IN_MINUTE,
|
|
463
478
|
MILLISECONDS_IN_SECOND,
|
|
464
479
|
MILLISECONDS_IN_WEEK,
|
|
480
|
+
MILLISECONDS_TT_TAI,
|
|
481
|
+
RINEX_CODES,
|
|
465
482
|
SECONDS_IN_DAY,
|
|
466
483
|
SECONDS_IN_HOUR,
|
|
467
484
|
SECONDS_IN_MINUTE,
|
|
468
485
|
SECONDS_IN_WEEK,
|
|
469
|
-
SECONDS_TT_TAI,
|
|
470
486
|
START_BDS_TIME,
|
|
471
487
|
START_GAL_TIME,
|
|
472
488
|
START_GLO_LEAP,
|
|
473
489
|
START_GPS_TIME,
|
|
474
490
|
START_JULIAN_CALENDAR_UNIX_SECONDS,
|
|
491
|
+
START_JULIAN_TAI,
|
|
475
492
|
START_LEAP_SECS_GPS,
|
|
476
493
|
START_MJD2000_TIME,
|
|
477
494
|
START_MJD_UNIX_SECONDS,
|
|
495
|
+
START_NTP_TIME,
|
|
496
|
+
START_TAI_TIME,
|
|
478
497
|
START_UNIX_TIME,
|
|
479
498
|
getBdsTime,
|
|
480
499
|
getDateFromBdsTime,
|
|
@@ -489,6 +508,8 @@ function getRINEX(date) {
|
|
|
489
508
|
getDateFromMJD,
|
|
490
509
|
getDateFromMJD2000,
|
|
491
510
|
getDateFromRINEX,
|
|
511
|
+
getDateFromTAI,
|
|
512
|
+
getDateFromTT,
|
|
492
513
|
getDateFromTimeOfDay,
|
|
493
514
|
getDateFromUnixTime,
|
|
494
515
|
getDayOfWeek,
|
|
@@ -496,16 +517,20 @@ function getRINEX(date) {
|
|
|
496
517
|
getGalTime,
|
|
497
518
|
getGloN4,
|
|
498
519
|
getGloNA,
|
|
520
|
+
getGpsLeap,
|
|
499
521
|
getGpsTime,
|
|
500
522
|
getHourCode,
|
|
501
523
|
getHoursFromTimeDifference,
|
|
502
524
|
getJulianDate,
|
|
503
|
-
|
|
504
|
-
getLeapSecondsFromTAI,
|
|
525
|
+
getLeap,
|
|
505
526
|
getMJD,
|
|
527
|
+
getMJD2000,
|
|
506
528
|
getMinutesFromTimeDifference,
|
|
529
|
+
getNtpTime,
|
|
507
530
|
getRINEX,
|
|
508
531
|
getSecondsFromTimeDifference,
|
|
532
|
+
getTAIDate,
|
|
533
|
+
getTTDate,
|
|
509
534
|
getTimeDifference,
|
|
510
535
|
getTimeDifferenceFromDays,
|
|
511
536
|
getTimeDifferenceFromHours,
|
|
@@ -516,5 +541,7 @@ function getRINEX(date) {
|
|
|
516
541
|
getTimeOfWeek,
|
|
517
542
|
getTotalDaysFromTimeDifference,
|
|
518
543
|
getUnixTime,
|
|
519
|
-
|
|
544
|
+
getUtcDate,
|
|
545
|
+
getWeekNumber,
|
|
546
|
+
getWeekOfYear
|
|
520
547
|
});
|