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/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 SECONDS_TT_TAI = 32.184;
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(Date.UTC(1980, 0, 6, 0, 0, 0, 0));
14
- var START_GAL_TIME = new Date(Date.UTC(1999, 7, 22, 0, 0, 0));
15
- var START_BDS_TIME = new Date(Date.UTC(2006, 0, 1, 0, 0, 0));
16
- var START_UNIX_TIME = new Date(Date.UTC(1970, 0, 1, 0, 0, 0));
17
- var START_MJD2000_TIME = new Date(Date.UTC(2e3, 0, 1, 0, 0, 0));
18
- var ALPHABET = "abcdefghijklmnopqrstuvwxyz".split("");
19
- var START_GLO_LEAP = new Date(Date.UTC(1996, 0, 1, 0, 0, 0, 0));
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 Math.floor(
136
- (date.getTime() - Date.UTC(
137
- date.getUTCFullYear(),
138
- date.getUTCMonth(),
139
- date.getUTCDate(),
140
- 0,
141
- 0,
142
- 0
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 getGloN4(date) {
162
- return Math.floor((date.getUTCFullYear() - START_GLO_LEAP.getFullYear()) / 4);
163
- }
164
- function getGloNA(date) {
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
- const date = new Date(
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 = ALPHABET.indexOf(hourCode);
253
- if (hour !== -1) {
254
- const newDate = new Date(date.getTime());
255
- newDate.setUTCHours(hour);
256
- return newDate;
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 ALPHABET[date.getUTCHours()];
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 getDateFromJulianDate(julianDate) {
267
- const date = new Date(
268
- (julianDate - START_JULIAN_CALENDAR_UNIX_SECONDS) * MILLISECONDS_IN_DAY
117
+ function getWeekOfYear(date) {
118
+ const target = new Date(
119
+ Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())
269
120
  );
270
- if (!isValidDate(date))
271
- return void 0;
272
- return date;
273
- }
274
- function getMJD(date) {
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
- return "> " + date.getUTCFullYear() + " " + (date.getUTCMonth() + 1).toString().padStart(2, "0") + " " + date.getUTCDate().toString().padStart(2, "0") + " " + date.getUTCHours().toString().padStart(2, "0") + " " + date.getUTCMinutes().toString().padStart(2, "0") + " " + (date.getUTCMilliseconds() / MILLISECONDS_IN_SECOND + date.getUTCSeconds()).toFixed(7).padStart(2, "0");
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
- ALPHABET,
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
- getLeapSeconds,
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
- getWeekNumber
443
+ getUtcDate,
444
+ getWeekNumber,
445
+ getWeekOfYear
433
446
  };
package/jest.config.js ADDED
@@ -0,0 +1,6 @@
1
+ module.exports = {
2
+ preset: 'ts-jest',
3
+ testEnvironment: 'node',
4
+ testMatch: ['**/test/**/*.test.js'],
5
+ moduleDirectories: ['node_modules', '<rootDir>'],
6
+ };