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