diff --git a/packages/tendermint-rpc/src/dates.spec.ts b/packages/tendermint-rpc/src/dates.spec.ts index e1e2a496..a9883af4 100644 --- a/packages/tendermint-rpc/src/dates.spec.ts +++ b/packages/tendermint-rpc/src/dates.spec.ts @@ -1,6 +1,12 @@ import { ReadonlyDate } from "readonly-date"; -import { DateTime, DateWithNanoseconds, fromRfc3339WithNanoseconds, toRfc3339WithNanoseconds } from "./dates"; +import { + DateTime, + DateWithNanoseconds, + fromRfc3339WithNanoseconds, + toRfc3339WithNanoseconds, + toSeconds, +} from "./dates"; describe("dates", () => { describe("fromRfc3339WithNanoseconds", () => { @@ -55,6 +61,51 @@ describe("dates", () => { }); }); + describe("toSeconds", () => { + it("works", () => { + { + const date = fromRfc3339WithNanoseconds("2020-12-15T10:57:26Z"); + expect(toSeconds(date)).toEqual([1608029846, 0]); + } + { + const date = fromRfc3339WithNanoseconds("2020-12-15T10:57:26.7Z"); + expect(toSeconds(date)).toEqual([1608029846, 700000000]); + } + { + const date = fromRfc3339WithNanoseconds("2020-12-15T10:57:26.77Z"); + expect(toSeconds(date)).toEqual([1608029846, 770000000]); + } + { + const date = fromRfc3339WithNanoseconds("2020-12-15T10:57:26.778Z"); + expect(toSeconds(date)).toEqual([1608029846, 778000000]); + } + { + const date = fromRfc3339WithNanoseconds("2020-12-15T10:57:26.7789Z"); + expect(toSeconds(date)).toEqual([1608029846, 778900000]); + } + { + const date = fromRfc3339WithNanoseconds("2020-12-15T10:57:26.77809Z"); + expect(toSeconds(date)).toEqual([1608029846, 778090000]); + } + { + const date = fromRfc3339WithNanoseconds("2020-12-15T10:57:26.778009Z"); + expect(toSeconds(date)).toEqual([1608029846, 778009000]); + } + { + const date = fromRfc3339WithNanoseconds("2020-12-15T10:57:26.7780009Z"); + expect(toSeconds(date)).toEqual([1608029846, 778000900]); + } + { + const date = fromRfc3339WithNanoseconds("2020-12-15T10:57:26.77800009Z"); + expect(toSeconds(date)).toEqual([1608029846, 778000090]); + } + { + const date = fromRfc3339WithNanoseconds("2020-12-15T10:57:26.778000009Z"); + expect(toSeconds(date)).toEqual([1608029846, 778000009]); + } + }); + }); + describe("DateTime", () => { it("decodes a string", () => { expect(DateTime.decode("2020-12-15T10:57:26.778Z").nanoseconds).toEqual(0); diff --git a/packages/tendermint-rpc/src/dates.ts b/packages/tendermint-rpc/src/dates.ts index 4a15ccfc..c296e1b1 100644 --- a/packages/tendermint-rpc/src/dates.ts +++ b/packages/tendermint-rpc/src/dates.ts @@ -25,6 +25,19 @@ export function toRfc3339WithNanoseconds(dateTime: ReadonlyDateWithNanoseconds): return `${millisecondIso.slice(0, -1)}${nanoseconds.padStart(6, "0")}Z`; } +/** + * Caclulates the UNIX timestamp in seconds as well as the nanoseconds after the given second. + * + * This is useful when dealing with external systems like the protobuf type + * [.google.protobuf.Timestamp](https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.Timestamp) + * or any other system that does not use millisecond precision. + */ +export function toSeconds(date: ReadonlyDateWithNanoseconds): [number, number] { + const seconds = Math.floor(date.getTime() / 1000); + const nanos = (date.getTime() % 1000) * 1000000 + (date.nanoseconds ?? 0); + return [seconds, nanos]; +} + /** @deprecated Use fromRfc3339WithNanoseconds/toRfc3339WithNanoseconds instead */ export class DateTime { /** @deprecated Use fromRfc3339WithNanoseconds instead */ diff --git a/packages/tendermint-rpc/src/index.ts b/packages/tendermint-rpc/src/index.ts index c6584a41..5864129f 100644 --- a/packages/tendermint-rpc/src/index.ts +++ b/packages/tendermint-rpc/src/index.ts @@ -6,6 +6,7 @@ export { ReadonlyDateWithNanoseconds, fromRfc3339WithNanoseconds, toRfc3339WithNanoseconds, + toSeconds, } from "./dates"; export { AbciInfoRequest,