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