Add fromSeconds

This commit is contained in:
Simon Warta 2021-02-15 17:27:14 +01:00
parent d610f5cba1
commit 058ce1b166
3 changed files with 69 additions and 0 deletions

View File

@ -4,6 +4,7 @@ import {
DateTime,
DateWithNanoseconds,
fromRfc3339WithNanoseconds,
fromSeconds,
toRfc3339WithNanoseconds,
toSeconds,
} from "./dates";
@ -61,6 +62,62 @@ describe("dates", () => {
});
});
describe("fromSeconds", () => {
it("works", () => {
{
const date = fromSeconds(1608029846);
expect(date).toEqual(fromRfc3339WithNanoseconds("2020-12-15T10:57:26Z"));
}
{
const date = fromSeconds(1608029846, 0);
expect(date).toEqual(fromRfc3339WithNanoseconds("2020-12-15T10:57:26Z"));
}
{
const date = fromSeconds(1608029846, 1);
expect(date).toEqual(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.000000001Z"));
}
{
const date = fromSeconds(1608029846, 10);
expect(date).toEqual(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.000000010Z"));
}
{
const date = fromSeconds(1608029846, 100);
expect(date).toEqual(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.000000100Z"));
}
{
const date = fromSeconds(1608029846, 1000);
expect(date).toEqual(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.000001000Z"));
}
{
const date = fromSeconds(1608029846, 10000);
expect(date).toEqual(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.000010000Z"));
}
{
const date = fromSeconds(1608029846, 100000);
expect(date).toEqual(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.000100000Z"));
}
{
const date = fromSeconds(1608029846, 1000000);
expect(date).toEqual(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.001000000Z"));
}
{
const date = fromSeconds(1608029846, 10000000);
expect(date).toEqual(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.010000000Z"));
}
{
const date = fromSeconds(1608029846, 100000000);
expect(date).toEqual(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.100000000Z"));
}
});
it("throws for nanos out of range", () => {
expect(() => fromSeconds(1608029846, 1000000000)).toThrow();
expect(() => fromSeconds(1608029846, -1)).toThrow();
expect(() => fromSeconds(1608029846, 1.2)).toThrow();
expect(() => fromSeconds(1608029846, NaN)).toThrow();
});
});
describe("toSeconds", () => {
it("works", () => {
{

View File

@ -1,4 +1,5 @@
import { fromRfc3339 } from "@cosmjs/encoding";
import { Uint32 } from "@cosmjs/math";
import { ReadonlyDate } from "readonly-date";
export interface ReadonlyDateWithNanoseconds extends ReadonlyDate {
@ -25,6 +26,16 @@ export function toRfc3339WithNanoseconds(dateTime: ReadonlyDateWithNanoseconds):
return `${millisecondIso.slice(0, -1)}${nanoseconds.padStart(6, "0")}Z`;
}
export function fromSeconds(seconds: number, nanos = 0): DateWithNanoseconds {
const checkedNanos = new Uint32(nanos).toNumber();
if (checkedNanos > 999_999_999) {
throw new Error("Nano seconds must not exceed 999999999");
}
const out: DateWithNanoseconds = new Date(seconds * 1000 + Math.floor(checkedNanos / 1000000));
out.nanoseconds = checkedNanos % 1000000;
return out;
}
/**
* Caclulates the UNIX timestamp in seconds as well as the nanoseconds after the given second.
*

View File

@ -5,6 +5,7 @@ export {
DateTime,
ReadonlyDateWithNanoseconds,
fromRfc3339WithNanoseconds,
fromSeconds,
toRfc3339WithNanoseconds,
toSeconds,
} from "./dates";