UNPKG

gpstime

Version:

Some GPS time-related utilities.

132 lines (117 loc) 5.44 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.gpsTimestampToWnTow = gpsTimestampToWnTow; exports.utcTimestampToWnTow = utcTimestampToWnTow; exports.wnTowToUtcTimestamp = wnTowToUtcTimestamp; exports.wnTowToGpsTimestamp = wnTowToGpsTimestamp; exports.gpsTimestampToUtcTimestamp = gpsTimestampToUtcTimestamp; exports.utcTimestampToGpsTimestamp = utcTimestampToGpsTimestamp; exports.currentGpsWnTow = currentGpsWnTow; /** * Copyright (C) 2016 Swift Navigation Inc. * Contact: Joshua Gross <josh@swift-nav.com> * This source is subject to the license found in the file 'LICENSE' which must * be distributed together with this source. All other rights reserved. * * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. */ // Unix timestamp of the GPS epoch 1980-01-06 00:00:00 UTC var gpsEpochSeconds = 315964800; // number of seconds in a week var weekSeconds = 60 * 60 * 24 * 7; // Leap UTC leap seconds since epoch (1970). UTC/GPS/Unix epoch starts with // a +10 leap second offset relative to TAI. There are UTC 10 leap seconds before // the first GPS time (not listed here). var gpsLeapSeconds = [new Date('1981-07-01T00:00:00.000Z'), new Date('1982-07-01T00:00:00.000Z'), new Date('1983-07-01T00:00:00.000Z'), new Date('1985-07-01T00:00:00.000Z'), new Date('1988-01-01T00:00:00.000Z'), new Date('1990-01-01T00:00:00.000Z'), new Date('1991-01-01T00:00:00.000Z'), new Date('1992-07-01T00:00:00.000Z'), new Date('1993-07-01T00:00:00.000Z'), new Date('1994-07-01T00:00:00.000Z'), new Date('1996-01-01T00:00:00.000Z'), new Date('1997-07-01T00:00:00.000Z'), new Date('1999-01-01T00:00:00.000Z'), new Date('2006-01-01T00:00:00.000Z'), new Date('2009-01-01T00:00:00.000Z'), new Date('2012-07-01T00:00:00.000Z'), new Date('2015-07-01T00:00:00.000Z'), new Date('2017-01-01T00:00:00.000Z')].reverse(); /** * Convert GPS Date timestamp (in GPS time, without leap seconds) to { wn, tow }. * * If you have a UTC timestamp, use `utcTimestampToWnTow`. * * @param {Date} gpsTimestamp - A timestamp representing a GPS timestamp, without leap-seconds. * @return {object} { wn, tow } */ function gpsTimestampToWnTow(gpsTimestamp) { var gpsTimeMs = gpsTimestamp.getTime() / 1000 - gpsEpochSeconds; var wn = Math.floor(gpsTimeMs / weekSeconds); var tow = gpsTimeMs - wn * weekSeconds; return { wn: wn, tow: tow }; } /** * Convert UTC Date timestamp to { wn, tow }. * * @param {Date} utcTimestamp - A timestamp, with GPS leap-seconds. * @return {object} { wn, tow } */ function utcTimestampToWnTow(utcTimestamp) { return gpsTimestampToWnTow(utcTimestampToGpsTimestamp(utcTimestamp)); } /** * Convert GPS tow (time of week) and wn (week number) to timestamp (in UTC time, * with leap seconds). * * @param {Number} wn - GPS week number * @param {Number} tow - GPS time of week, seconds (fractional seconds okay) * @returns {Date} - A `Date` object representing a UTC timestamp, with leap-seconds. */ function wnTowToUtcTimestamp(wn, tow) { return gpsTimestampToUtcTimestamp(wnTowToGpsTimestamp(wn, tow)); } /** * Convert GPS tow (time of week) and wn (week number) to moment timestamp (in GPS time, * without leap seconds). * * @param {Number} wn - GPS week number * @param {Number} tow - GPS time of week, seconds (fractional seconds okay) * @returns {Date} - A `Date` object representing a GPS timestamp, without leap-seconds. */ function wnTowToGpsTimestamp(wn, tow) { return new Date((gpsEpochSeconds + weekSeconds * wn + tow) * 1000); } /** * Convert GPS timestamp without leap seconds to a UTC timestamps with leap seconds. * * @param {Date} timestamp - A `moment` object representing a GPS timestamp, w/o leap-seconds. * @returns {Date} - A `moment` object representing a UTC timestamp, with leap-seconds. */ function gpsTimestampToUtcTimestamp(gpsTimestamp) { // Get lastIndex for which our gpsTimestamp is greater var lastIndex = void 0; for (lastIndex = 0; lastIndex < gpsLeapSeconds.length; ++lastIndex) { if (gpsTimestamp - gpsLeapSeconds[lastIndex] > 0) { break; } } var leapSecondsOffset = gpsLeapSeconds.length - lastIndex; return new Date(gpsTimestamp.getTime() - leapSecondsOffset * 1000); } /** * Convert UTC timestamp with leap seconds to a GPS timestamps without leap seconds. * * @param {Date} timestamp - A `moment` object representing a GPS timestamp, w/o leap-seconds. * @returns {Date} - A `moment` object representing a UTC timestamp, with leap-seconds. */ function utcTimestampToGpsTimestamp(utcTimestamp) { // Get lastIndex for which our gpsTimestamp is greater var lastIndex = void 0; for (lastIndex = 0; lastIndex < gpsLeapSeconds.length; ++lastIndex) { if (utcTimestamp - gpsLeapSeconds[lastIndex] > 0) { break; } } var leapSecondsOffset = gpsLeapSeconds.length - lastIndex; return new Date(utcTimestamp.getTime() + leapSecondsOffset * 1000); } /** * Convert UTC timestamp with leap seconds to a GPS timestamps without leap seconds. * * @param {Date} timestamp - A `moment` object representing a GPS timestamp, w/o leap-seconds. * @returns {Date} - A `moment` object representing a UTC timestamp, with leap-seconds. */ function currentGpsWnTow() { return utcTimestampToWnTow(new Date()); }