From f24f7ec334c5f4f86199a9c2d5da4a531b16c78c Mon Sep 17 00:00:00 2001 From: Kerry Shetline Date: Tue, 27 Apr 2021 21:20:03 -0400 Subject: [PATCH] Updated historic delta-T values from http://astro.ukho.gov.uk/nao/lvm/ (#11) * Updated historic delta-T values from http://astro.ukho.gov.uk/nao/lvm/ (replacing data from maia.usno.navy.mil and https://stjarnhimlen.se/comp/time.html). * Added predicted delta-T for start of 2022. * Updated rough predictive future delta-T calculations. --- README.md | 3 +- package-lock.json | 22 +++--- package.json | 12 ++-- src/date-time.spec.ts | 6 +- src/timezone-large-alt.ts | 2 +- src/timezone-large.ts | 2 +- src/timezone-small.ts | 2 +- src/ut-converter.spec.ts | 23 ++++--- src/ut-converter.ts | 140 +++++++++++++++++++------------------- 9 files changed, 107 insertions(+), 105 deletions(-) diff --git a/README.md b/README.md index 980ec5c..1ed4b43 100644 --- a/README.md +++ b/README.md @@ -931,7 +931,7 @@ Note that this only works for defined leap seconds. `new DateTime('2021-04-15 23 * From TAI, Julian date, or modified Julian date values. For example:
`new DateTime('1972-07-01T00:00:10 TAI', 'UTC').toString()` → `"DateTime<1972-06-30T23:59:60.000 +00:00>"`
-`new DateTime({ jde: 2450630.500724913 }, 'UTC').toIsoString(19)` → +`new DateTime({ jde: 2450630.5007242477 }, 'UTC').toIsoString(19)` → `"1997-06-30T23:59:60"`

* By add/subtract operations using TAI quantities: `new DateTime('2016-12-31 18:59:59 EST').add('seconds_tai', 1).toString()` → @@ -1286,6 +1286,7 @@ addDaysToDate(deltaDays: number, yearOrDate: YearOrDate, month?: number, day?: n ```typescript static OS_ZONE: Timezone; // Local timezone as derived from analyzing values returned by JavaScript `Date`. + static TAI_ZONE: Timezone; // International Atomic Time (TAI). static UT_ZONE: Timezone; // Universal Coordinated Time (AKA UTC, UCT, GMT, Zulu Time, etc.) static ZONELESS: Timezone; // A pseudo timezone for abstract date/time instances. static DATELESS: Timezone; // A pseudo timezone for abstract dateless, time-only `DateTime` instances. diff --git a/package-lock.json b/package-lock.json index ebc8704..a828c7e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@tubular/time", - "version": "2.6.2", + "version": "2.6.4", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1272,9 +1272,9 @@ } }, "@types/chai": { - "version": "4.2.16", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.16.tgz", - "integrity": "sha512-vI5iOAsez9+roLS3M3+Xx7w+WRuDtSmF8bQkrbcIJ2sC1PcDgVoA0WGpa+bIrJ+y8zqY2oi//fUctkxtIcXJCw==", + "version": "4.2.17", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.17.tgz", + "integrity": "sha512-LaiwWNnYuL8xJlQcE91QB2JoswWZckq9A4b+nMPq8dt8AP96727Nb3X4e74u+E3tm4NLTILNI9MYFsyVc30wSA==", "dev": true }, "@types/eslint": { @@ -1322,9 +1322,9 @@ "dev": true }, "@types/node": { - "version": "14.14.41", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.41.tgz", - "integrity": "sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g==", + "version": "14.14.43", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.43.tgz", + "integrity": "sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ==", "dev": true }, "@typescript-eslint/eslint-plugin": { @@ -5926,9 +5926,9 @@ } }, "webpack": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.35.1.tgz", - "integrity": "sha512-uWKYStqJ23+N6/EnMEwUjPSSKUG1tFmcuKhALEh/QXoUxwN8eb3ATNIZB38A+fO6QZ0xfc7Cu7KNV9LXNhDCsw==", + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.36.0.tgz", + "integrity": "sha512-HdOhLXClUEwTnzQnzpSG9iL00ej23ojvfnGpF49ba0MkuAT2q+WhQilHFFJHOIVRBqbzakQ1vCWQV2K+QLX0Qw==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", @@ -5936,7 +5936,7 @@ "@webassemblyjs/ast": "1.11.0", "@webassemblyjs/wasm-edit": "1.11.0", "@webassemblyjs/wasm-parser": "1.11.0", - "acorn": "^8.0.4", + "acorn": "^8.2.1", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.8.0", diff --git a/package.json b/package.json index 76f2c63..79c7c5e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@tubular/time", - "version": "2.6.2", - "description": "Date/time, IANA timezones, calendar with settable Julian/Gregorian switchover", + "version": "2.6.4", + "description": "Date/time, IANA timezones, leap seconds, TAI/UTC conversions, calendar with settable Julian/Gregorian switchover", "browser": "dist/web/index.js", "browser-es5": "dist/web5/index.js", "main": "dist/es6/index.js", @@ -19,6 +19,7 @@ "document": "typedoc --name \"ks-date-time-zone\" --module commonjs --exclude \"**/*+(e2e|spec|index).ts\" --excludePrivate --excludeProtected --readme README.md --target ES5 --out docs src" }, "keywords": [ + "astronomy", "calendar", "date", "gregorian", @@ -27,6 +28,7 @@ "leap second", "moment", "olson", + "tdt", "tai", "time", "time zone", @@ -44,9 +46,9 @@ "@babel/core": "^7.13.16", "@babel/preset-env": "^7.13.15", "@babel/register": "^7.13.16", - "@types/chai": "^4.2.16", + "@types/chai": "^4.2.17", "@types/mocha": "^8.2.2", - "@types/node": "^14.14.41", + "@types/node": "^14.14.43", "@typescript-eslint/eslint-plugin": "^4.22.0", "@typescript-eslint/parser": "^4.22.0", "babel-loader": "^8.2.2", @@ -65,7 +67,7 @@ "terser-webpack-plugin": "^4.2.3", "ts-node": "^9.1.1", "typescript": "^4.2.4", - "webpack": "^5.35.1", + "webpack": "^5.36.0", "webpack-cli": "^4.6.0", "webpack-node-externals": "^2.5.2" }, diff --git a/src/date-time.spec.ts b/src/date-time.spec.ts index 0aead54..fea351b 100644 --- a/src/date-time.spec.ts +++ b/src/date-time.spec.ts @@ -542,8 +542,8 @@ describe('DateTime', () => { expect(new DateTime('1995-12-31 23:59:60Z').compare(new DateTime('1995-12-31 23:59:59Z'))).to.be.greaterThan(0); expect(new DateTime('1996-12-31 23:59:60Z').toString()).to.equal('DateTime<1997-01-01T00:00:00.000 +00:00>'); expect(new DateTime('1972-06-30 23:59:60Z', 'TAI').toString()).to.equal('DateTime<1972-07-01T00:00:10.000 TAI>'); - expect(new DateTime('1997-06-30 23:59:60Z').wallTime.jde).to.be.closeTo(2450630.500724913, 1E-9); - expect(new DateTime({ jde: 2450630.500724913 }, 'utc').toIsoString(19)).to.equal('1997-06-30T23:59:60'); + expect(new DateTime('1997-06-30 23:59:60Z').wallTime.jde).to.be.closeTo(2450630.5007242477, 1E-9); + expect(new DateTime({ jde: 2450630.5007242477 }, 'utc').toIsoString(19)).to.equal('1997-06-30T23:59:60'); expect(ttime.sort([new DateTime('1995-12-31 23:59:60Z'), new DateTime('1995-12-31 23:59:59Z')]) .map(dt => dt.format(ttime.DATETIME_LOCAL_SECONDS)).join()).to.equal('1995-12-31T23:59:59,1995-12-31T23:59:60'); @@ -581,7 +581,7 @@ describe('DateTime', () => { }); it('should correctly handle TDT/UT/TAI conversions', () => { - expect(new DateTime('1945-05-08Z').deltaTaiMillis).to.be.closeTo(-5249, 2); + expect(new DateTime('1945-05-08Z').deltaTaiMillis).to.be.closeTo(-4965, 2); expect(new DateTime('1995-12-31 23:59:59Z').add('second_tai', 1).toString()).to.equal('DateTime<1995-12-31T23:59:60.000 +00:00>'); expect(new DateTime('1995-12-31 23:59:00Z').add(DateTimeField.MINUTE_TAI, 1).toString()).to.equal('DateTime<1995-12-31T23:59:60.000 +00:00>'); diff --git a/src/timezone-large-alt.ts b/src/timezone-large-alt.ts index 705c73d..e176c56 100644 --- a/src/timezone-large-alt.ts +++ b/src/timezone-large-alt.ts @@ -3,7 +3,7 @@ const timezoneLargeAlt = /* trim-file-start */{ // tz database version: 2021a, years 1800-2088, rounded to nearest minute, filtered, calendar rollbacks eliminated version: '2021a', years: '1800-2088', - deltaTs: '69.36 69.36', + deltaTs: '69.36 69.36 69.45', leapSeconds: '912 1096 1461 1826 2191 2557 2922 3287 3652 4199 4564 4929 5660 6574 7305 7670 8217 8582 8947 9496 10043 10592 13149 14245 15522 16617 17167', 'Africa/Abidjan': '-0016 +0000 0;-g/0/LMT 0/0/GMT;1;-2ldXI;;48e5;BFCIGMGNMLMRSHSLSNTG', 'Africa/Accra': '-0001 +0000 0;-1/0/LMT 0/0/GMT k/k u/0 u/u;1212121212121212121212121212121212121212121212131414141414141;-2bRzX 9RbX fdE 1BAk MLE 1Bck MLE 1Bck MLE 1Bck MLE 1BAk MLE 1Bck MLE 1Bck MLE 1Bck MLE 1BAk MLE 1Bck MLE 1Bck MLE 1Bck MLE 1BAk MLE 1Bck MLE 1Bck MLE 1Bck MLE 1BAk MLE 1Bck MLE 1Bck MLE 1Bck MLE Mok 1BXE M0k 1BXE fak 9vbu bjCu MLu 1Bcu MLu 1BAu MLu 1Bcu MLu 1Bcu MLu 1Bcu MLu;;41e5;GH', diff --git a/src/timezone-large.ts b/src/timezone-large.ts index 4d52b18..4a0c4ae 100644 --- a/src/timezone-large.ts +++ b/src/timezone-large.ts @@ -3,7 +3,7 @@ const timezoneLarge = /* trim-file-start */{ // tz database version: 2021a, years 1800-2088 version: '2021a', years: '1800-2088', - deltaTs: '69.36 69.36', + deltaTs: '69.36 69.36 69.45', leapSeconds: '912 1096 1461 1826 2191 2557 2922 3287 3652 4199 4564 4929 5660 6574 7305 7670 8217 8582 8947 9496 10043 10592 13149 14245 15522 16617 17167', 'Africa/Abidjan': '-001608 +0000 0;-g.8/0/LMT 0/0/GMT;1;-2ldXH.Q;;48e5;BFCIGMGNMLMRSHSLSNTG', 'Africa/Accra': '-000052 +0000 0;-0.Q/0/LMT 0/0/GMT k/k u/0 u/u;1212121212121212121212121212121212121212121212131414141414141;-2bRzX.8 9RbX.8 fdE 1BAk MLE 1Bck MLE 1Bck MLE 1Bck MLE 1BAk MLE 1Bck MLE 1Bck MLE 1Bck MLE 1BAk MLE 1Bck MLE 1Bck MLE 1Bck MLE 1BAk MLE 1Bck MLE 1Bck MLE 1Bck MLE 1BAk MLE 1Bck MLE 1Bck MLE 1Bck MLE Mok 1BXE M0k 1BXE fak 9vbu bjCu MLu 1Bcu MLu 1BAu MLu 1Bcu MLu 1Bcu MLu 1Bcu MLu;;41e5;GH', diff --git a/src/timezone-small.ts b/src/timezone-small.ts index 7a7b215..8e87aa8 100644 --- a/src/timezone-small.ts +++ b/src/timezone-small.ts @@ -3,7 +3,7 @@ const timezoneSmall = /* trim-file-start */{ // tz database version: 2021a, years 2016-2026 version: '2021a', years: '2016-2026', - deltaTs: '69.36 69.36', + deltaTs: '69.36 69.36 69.45', leapSeconds: '912 1096 1461 1826 2191 2557 2922 3287 3652 4199 4564 4929 5660 6574 7305 7670 8217 8582 8947 9496 10043 10592 13149 14245 15522 16617 17167', 'Africa/Abidjan': '+0000 +0000 0;0/0/GMT;;;;48e5;BFCIGMGNMLMRSHSLSNTG', 'Africa/Algiers': '+0100 +0100 0;10/0/CET;;;;26e5;DZ', diff --git a/src/ut-converter.spec.ts b/src/ut-converter.spec.ts index cde83a7..4c99a21 100644 --- a/src/ut-converter.spec.ts +++ b/src/ut-converter.spec.ts @@ -7,16 +7,17 @@ import { round } from '@tubular/math'; const SIX_MONTHS_DAYS = 180; const TEST_DTS = [ - 22.51, 23.01, 23.46, 23.63, 23.95, 24.39, 24.34, 24.1, 24.02, 23.98, - 23.89, 23.93, 23.88, 23.91, 23.76, 23.91, 23.96, 24.04, 24.35, 24.82, - 25.3, 25.77, 26.27, 26.76, 27.27, 27.77, 28.25, 28.7, 29.15, 29.57, - 29.97, 30.36, 30.72, 31.07, 31.35, 31.68, 32.17, 32.67, 33.15, 33.58, - 33.99, 34.47, 35.03, 35.74, 36.55, 37.43, 38.29, 39.2, 40.18, 41.17, - 42.23, 43.37, 44.48, 45.48, 46.46, 47.52, 48.53, 49.59, 50.54, 51.38, - 52.17, 52.96, 53.79, 54.34, 54.87, 55.32, 55.82, 56.3, 56.86, 57.57, - 58.31, 59.12, 59.98, 60.79, 61.63, 62.3, 62.97, 63.47, 63.83, 64.09, - 64.3, 64.47, 64.57, 64.69, 64.85, 65.15, 65.46, 65.78, 66.07, 66.32, - 66.6, 66.91, 67.28, 67.64, 68.1, 68.59, 68.97, 69.22, 69.36, 69.36 + 22.69, 23.12, 23.49, 23.79, 24.02, 24.20, 24.32, 24.39, 24.42, 24.41, + 24.38, 24.32, 24.25, 24.16, 24.08, 24.04, 24.06, 24.17, 24.43, 24.83, + 25.35, 25.92, 26.51, 27.05, 27.51, 27.89, 28.24, 28.58, 28.93, 29.32, + 29.70, 30.00, 30.20, 30.41, 30.76, 31.34, 32.03, 32.65, 33.07, 33.36, + 33.62, 33.96, 34.44, 35.09, 35.95, 36.93, 37.96, 38.95, 39.93, 40.95, + 42.04, 43.15, 44.24, 45.28, 46.28, 47.29, 48.33, 49.37, 50.36, 51.28, + 52.13, 52.94, 53.70, 54.39, 54.98, 55.46, 55.89, 56.37, 56.99, 57.70, + 58.45, 59.19, 59.92, 60.68, 61.46, 62.23, 62.90, 63.42, 63.81, 64.08, + 64.27, 64.41, 64.55, 64.73, 64.95, 65.20, 65.48, 65.77, 66.06, 66.33, + 66.61, 66.92, 67.28, 67.69, 68.11, 68.53, 68.92, 69.24, 69.36, 69.36, + 69.45 ]; describe('UT/TDT Converter', () => { @@ -32,7 +33,7 @@ describe('UT/TDT Converter', () => { expect(taiToUtMillis(utToTaiMillis(millis, true), true)).to.equal(millis); } - for (let y = 1922; y <= 2021; ++y) { + for (let y = 1922; y <= 2022; ++y) { const now = new DateTime([y], 'UTC'); const epochMillis = now.epochMillis; const deltaTai = round(now.wallTime.deltaTai * 1000); diff --git a/src/ut-converter.ts b/src/ut-converter.ts index ed02f66..2153204 100644 --- a/src/ut-converter.ts +++ b/src/ut-converter.ts @@ -1,4 +1,4 @@ -import { floor, max, round, squared } from '@tubular/math'; +import { floor, max, round } from '@tubular/math'; import { clone } from '@tubular/util'; import { DAY_MSEC, DAY_SEC, DELTA_TDT_DAYS, DELTA_TDT_MSEC, JD_J2000, UNIX_TIME_ZERO_AS_JULIAN_DAY, YMDDate } from './common'; import { Timezone } from './timezone'; @@ -7,69 +7,71 @@ import { getDateFromDayNumber_SGC, getDayNumber_SGC } from './calendar'; /* eslint-disable @typescript-eslint/indent, comma-spacing, space-infix-ops */ const baseHistoricDeltaT = [ // Values to smooth transition from polynomial used for earlier years. - // 1600-1619 - 120.3 , 120.3 , 120.5 , 120.6 , 120.7 , 120.9 , 121.0 , 121.1 , 121.3 , 121.5 , - 121.6 , 121.9 , 122.0 , 122.2 , 122.5 , 122.7 , 122.9 , 123.2 , 123.4 , 123.7 , -// From http://www.phys.uu.nl/~vgent/deltat/deltat.htm (1659 value modified for -// smoother transition to next data source.), https://stjarnhimlen.se/comp/time.html - // 1620-1659 - 124 , 119 , 115 , 110 , 106 , 102 , 98 , 95 , 91 , 88 , - 85 , 82 , 79 , 77 , 74 , 72 , 70 , 67 , 65 , 63 , - 62 , 60 , 58 , 57 , 55 , 54 , 53 , 51 , 50 , 49 , - 48 , 47 , 46 , 45 , 44 , 43 , 42 , 41 , 40 , 39 , -// From http://maia.usno.navy.mil/ser7/historic_deltat.data, https://stjarnhimlen.se/comp/time.html - // 1660-1699 - 38 , 37 , 36 , 37 , 38 , 36 , 35 , 34 , 33 , 32 , - 31 , 30 , 29 , 29 , 28 , 27 , 26 , 25 , 25 , 26 , - 26 , 25 , 24 , 24 , 24 , 24 , 24 , 23 , 23 , 22 , - 22 , 22 , 21 , 21 , 21 , 21 , 20 , 20 , 20 , 20 , + // 1580-1599 + 130.8, 129.7, 128.6, 127.5, 126.4, 125.4, 124.3, 123.2, 122.1, 121.0, + 119.9, 118.8, 117.7, 116.6, 115.5, 114.5, 113.4, 112.3, 111.2, 110.1, + +// From http://astro.ukho.gov.uk/nao/lvm/, with interpolated between-decade values. + // 1600-1649 + 109 , 107 , 106 , 104 , 103 , 101 , 99.7, 98.2, 96.8, 95.4, + 94.0, 92.6, 91.2, 89.8, 88.4, 87.0, 85.6, 84.2, 82.8, 81.4, + 80.0, 78.6, 77.2, 75.7, 74.3, 72.9, 71.5, 70.1, 68.7, 67.3, + 66.0, 64.7, 63.4, 62.2, 60.9, 59.7, 58.5, 57.4, 56.2, 55.1, + 54.0, 52.9, 51.9, 50.8, 49.8, 48.8, 47.8, 46.9, 45.9, 45.0, + // 1650-1699 + 44.0, 43.1, 42.1, 41.2, 40.2, 39.3, 38.4, 37.5, 36.7, 35.8, + 35.0, 34.2, 33.5, 32.7, 32.0, 31.3, 30.6, 30.0, 29.3, 28.6, + 28.0, 27.4, 26.7, 26.1, 25.5, 24.9, 24.3, 23.7, 23.1, 22.6, + 22.0, 21.4, 20.9, 20.4, 19.8, 19.3, 18.8, 18.3, 17.9, 17.4, + 17.0, 16.6, 16.3, 15.9, 15.6, 15.3, 15.0, 14.8, 14.5, 14.3, // 1700-1749 - 21 , 21 , 20 , 20 , 19 , 19 , 19 , 20 , 20 , 20 , - 20 , 20 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , - 21.1 , 21.0 , 20.9 , 20.7 , 20.4 , 20.0 , 19.4 , 18.7 , 17.8 , 17.0 , - 16.6 , 16.1 , 15.7 , 15.3 , 14.7 , 14.3 , 14.1 , 14.1 , 13.7 , 13.5 , - 13.5 , 13.4 , 13.4 , 13.3 , 13.2 , 13.2 , 13.1 , 13.0 , 13.3 , 13.5 , + 14.0, 13.8, 13.5, 13.3, 13.0, 12.8, 12.6, 12.4, 12.3, 12.1, + 12.0, 11.9, 11.9, 11.8, 11.8, 11.8, 11.8, 11.9, 11.9, 11.9, + 12.0, 12.1, 12.1, 12.2, 12.3, 12.4, 12.5, 12.6, 12.7, 12.8, + 13.0, 13.2, 13.3, 13.5, 13.7, 13.9, 14.1, 14.4, 14.6, 14.8, + 15.0, 15.2, 15.4, 15.6, 15.8, 16.0, 16.2, 16.4, 16.6, 16.8, // 1750-1799 - 13.7 , 13.9 , 14.0 , 14.1 , 14.1 , 14.3 , 14.4 , 14.6 , 14.7 , 14.7 , - 14.8 , 14.9 , 15.0 , 15.2 , 15.4 , 15.6 , 15.6 , 15.9 , 15.9 , 15.7 , - 15.7 , 15.7 , 15.9 , 16.1 , 15.9 , 15.7 , 15.3 , 15.5 , 15.6 , 15.6 , - 15.6 , 15.5 , 15.4 , 15.2 , 14.9 , 14.6 , 14.3 , 14.1 , 14.2 , 13.7 , - 13.3 , 13.0 , 13.2 , 13.1 , 13.3 , 13.5 , 13.2 , 13.1 , 13.0 , 12.6 , + 17.0, 17.2, 17.4, 17.6, 17.8, 18.0, 18.2, 18.4, 18.6, 18.8, + 19.0, 19.2, 19.5, 19.7, 19.9, 20.1, 20.4, 20.6, 20.7, 20.9, + 21.0, 21.1, 21.1, 21.1, 21.1, 21.1, 21.1, 21.1, 21.0, 21.0, + 21.0, 21.0, 21.0, 21.1, 21.1, 21.2, 21.2, 21.2, 21.2, 21.1, + 21.0, 20.9, 20.7, 20.5, 20.2, 19.9, 19.7, 19.3, 19.0, 18.7, + +// From http://astro.ukho.gov.uk/nao/lvm/ // 1800-1849 - 12.6 , 12.0 , 11.8 , 11.4 , 11.1 , 11.1 , 11.1 , 11.1 , 11.2 , 11.5 , - 11.2 , 11.7 , 11.9 , 11.8 , 11.8 , 11.8 , 11.6 , 11.5 , 11.4 , 11.3 , - 11.13, 10.94, 10.29, 9.94, 9.88, 9.72, 9.66, 9.51, 9.21, 8.60, - 7.95, 7.59, 7.36, 7.10, 6.89, 6.73, 6.39, 6.25, 6.25, 6.22, - 6.22, 6.30, 6.35, 6.32, 6.33, 6.37, 6.40, 6.46, 6.48, 6.53, + 18.4 , 18.0 , 17.6 , 17.3 , 16.9 , 16.6 , 16.3 , 16.0 , 15.8 , 15.7 , + 15.7 , 15.7 , 15.8 , 16.0 , 16.2 , 16.4 , 16.5 , 16.7 , 16.7 , 16.7 , + 16.5 , 16.2 , 15.8 , 15.3 , 14.8 , 14.1 , 13.5 , 12.8 , 12.1 , 11.4 , + 10.8 , 10.2 , 9.7 , 9.3 , 8.9 , 8.5 , 8.2 , 8.0 , 7.8 , 7.7 , + 7.6 , 7.6 , 7.7 , 7.7 , 7.9 , 8.0 , 8.2 , 8.5 , 8.7 , 9.0 , // 1850-1899 - 6.55, 6.69, 6.84, 7.03, 7.15, 7.26, 7.23, 7.21, 6.99, 7.19, - 7.35, 7.41, 7.36, 6.95, 6.45, 5.92, 5.15, 4.11, 2.94, 1.97, - 1.04, 0.11, -0.82, -1.70, -2.48, -3.19, -3.84, -4.43, -4.79, -5.09, - -5.36, -5.37, -5.34, -5.40, -5.58, -5.74, -5.69, -5.67, -5.73, -5.78, - -5.86, -6.01, -6.28, -6.53, -6.50, -6.41, -6.11, -5.63, -4.68, -3.72, + 9.3 , 9.67, 9.98, 10.23, 10.37, 10.36, 10.18, 9.88, 9.54, 9.24, + 9.04, 8.99, 9.01, 8.97, 8.76, 8.25, 7.38, 6.22, 4.92, 3.59, + 2.37, 1.36, 0.56, -0.10, -0.65, -1.13, -1.58, -2.01, -2.43, -2.83, + -3.21, -3.58, -3.91, -4.17, -4.34, -4.39, -4.31, -4.14, -3.97, -3.86, + -3.88, -4.07, -4.37, -4.69, -4.93, -5.02, -4.87, -4.48, -3.86, -3.02, // 1900-1949 - -2.70, -1.48, -0.08, 1.26, 2.59, 3.92, 5.20, 6.29, 7.68, 9.13, - 10.38, 11.64, 13.23, 14.69, 16.00, 17.19, 18.19, 19.13, 20.14, 20.86, - 21.41, 22.06, 22.51, 23.01, 23.46, 23.63, 23.95, 24.39, 24.34, 24.10, - 24.02, 23.98, 23.89, 23.93, 23.88, 23.91, 23.76, 23.91, 23.96, 24.04, - 24.35, 24.82, 25.30, 25.77, 26.27, 26.76, 27.27, 27.77, 28.25, 28.70, - // 1950-1973 - 29.15, 29.57, 29.97, 30.36, 30.72, 31.07, 31.35, 31.68, 32.17, 32.67, - 33.15, 33.58, 33.99, 34.47, 35.03, 35.74, 36.55, 37.43, 38.29, 39.20, - 40.18, 41.17, 42.23, 43.37, - -// From http://maia.usno.navy.mil/ser7/deltat.data - // 1974-1999 - 44.48, 45.48, 46.46, 47.52, 48.53, 49.59, - 50.54, 51.38, 52.17, 52.96, 53.79, 54.34, 54.87, 55.32, 55.82, 56.30, - 56.86, 57.57, 58.31, 59.12, 59.98, 60.79, 61.63, 62.30, 62.97, 63.47, - // 2000-2019 - 63.83, 64.09, 64.30, 64.47, 64.57, 64.69, 64.85, 65.15, 65.46, 65.78, - 66.07, 66.32, 66.60, 66.91, 67.28, 67.64, 68.10, 68.59, 68.97, 69.22 + -1.98, -0.75, 0.62, 2.06, 3.51, 4.92, 6.24, 7.49, 8.70, 9.90, + 11.14, 12.43, 13.75, 15.06, 16.32, 17.48, 18.52, 19.44, 20.25, 20.98, + 21.62, 22.19, 22.69, 23.12, 23.49, 23.79, 24.02, 24.20, 24.32, 24.39, + 24.42, 24.41, 24.38, 24.32, 24.25, 24.16, 24.08, 24.04, 24.06, 24.17, + 24.43, 24.83, 25.35, 25.92, 26.51, 27.05, 27.51, 27.89, 28.24, 28.58, + +// From http://astro.ukho.gov.uk/nao/lvm/, mid-year values omitted + // 1950-1999 + 28.93, 29.32, 29.70, 30.00, 30.20, 30.41, 30.76, 31.34, 32.03, 32.65, + 33.07, 33.36, 33.62, 33.96, 34.44, 35.09, 35.95, 36.93, 37.96, 38.95, + 39.93, 40.95, 42.04, 43.15, 44.24, 45.28, 46.28, 47.29, 48.33, 49.37, + 50.36, 51.28, 52.13, 52.94, 53.70, 54.39, 54.98, 55.46, 55.89, 56.37, + 56.99, 57.70, 58.45, 59.19, 59.92, 60.68, 61.46, 62.23, 62.90, 63.42, + // 2000-2019 + 63.81, 64.08, 64.27, 64.41, 64.55, 64.73, 64.95, 65.20, 65.48, 65.77, + 66.06, 66.33, 66.61, 66.92, 67.28, 67.69, 68.11, 68.53, 68.92, 69.24 // From 2020 onward, data from timezone files, via updateDeltaTs(). // Get additional data from https://www.iers.org/IERS/EN/DataProducts/EarthOrientationData/eop.html -// As ΔT = 32.184 (for TDT - TAI) + 37 (for TAI - UTC) - (UT1-UTC) +// As ΔT = 32.184 (for TDT - TAI) + (TAI - UTC)† - (UT1-UTC) +// † 37 seconds on 2021-04-27, as will likely remain for some time. ]; let historicDeltaT = clone(baseHistoricDeltaT); @@ -194,19 +196,19 @@ export function taiToUtMillis(millis: number, forUtc = false): number { function deltaTAtStartOfYear(year: number): number { // Make the post-table approximations line up with the last tabular delta T. if (lastTableYear < 0) { - lastTableYear = historicDeltaT.length + 1598; // Temporarily 1 less than it should be + lastTableYear = historicDeltaT.length + 1578; // Temporarily 1 less than it should be calibration = historicDeltaT[historicDeltaT.length - 1] - deltaTAtStartOfYear(lastTableYear + 1); ++lastTableYear; } - // Polynomial expressions from http://sunearth.gsfc.nasa.gov/eclipse/SEhelp/deltatpoly2004.html + // Polynomial expressions from http://eclipsewise.com/help/deltatpoly2014.html let t, u; if (year < -500) { - u = (year - 1820.0) / 100.0; + u = (year - 1820) / 100; - return -20.0 + 32.0 * u ** 2; + return -20 + 32 * u ** 2; } else if (year < 500) { u = year / 100.0; @@ -214,26 +216,22 @@ function deltaTAtStartOfYear(year: number): number { return 10583.6 - 1014.41 * u + 33.78311 * u ** 2 - 5.952053 * u ** 3 - 0.1798452 * u ** 4 + 0.022174192 * u ** 5 + 0.0090316521 * u ** 6; } - else if (year < 1600) { + else if (year <= 1580) { u = (year - 1000.0) / 100.0; return 1574.2 - 556.01 * u + 71.23472 * u ** 2 + 0.319781 * u ** 3 - 0.8503463 * u ** 4 - 0.005050998 * u ** 5 + 0.0083572073 * u ** 6; } else if (year <= lastTableYear) - return historicDeltaT[year - 1600]; - else if (year < 2050) { - t = year - 2000.0; + return historicDeltaT[year - 1580]; + else if (year < 3000) { + t = year - 2015; - // Had started with 69.62 + ..., modified so that this would agree with real observed delta-T at 2010. - return calibration + 0.32217 * t + 0.005589 * t ** 2; + return calibration + 67.69 + 0.3645 * t + 0.0039755 * t ** 2; } - else if (year < 2150) - // Had started with constant 20.0 + ..., modified so that this would agree with previous approximation at 2050 - return calibration - 81.76 + 32.0 * squared((year - 1820.0)/ 100.0) - 0.5628 * (2150.0 - year); u = (year - 1820.0) / 100.0; - // Had started with constant 20.0 + ..., modified so that this would agree with previous approximation at 2150 - return calibration - 81.76 + 32.0 * u ** 2; + // Changed -20 in original expression to -171.82, so result matches above formula at year 3000 + return calibration - 171.82 + 32 * u ** 2; }