Golang's time is excellent. This is a small, close-as-reasonable port of the API to typescript with full support for time zone conversions, parsing and formatting.
npm install timedotgo
import * as time from "timedotgo";
// 0, 1, 2, 3, 4, 5, 6, 7 -- simple as.
const format = "Monday January 02 03:04:05.000 PM -07:00:00";
const now = time.Now();
const california = now.In("America/Los_Angeles");
const berlin = now.In("Europe/Berlin");
console.log("Right now, it is:");
console.log("Local:", now.Format(format));
console.log("UTC:", now.UTC().Format(format));
console.log("California:", california.Format(format));
console.log("Berlin:", berlin.Format(format));
Right now, it is:
Local: Tuesday June 03 12:15:03.191 PM -04:00:00
UTC: Tuesday June 03 04:15:03.191 PM +00:00:00
California: Tuesday June 03 09:15:03.191 AM -07:00:00
Berlin: Tuesday June 03 06:15:03.191 PM +02:00:00
import * as time from "timedotgo";
const date_string = "Dec 31, 2025 17:30";
const format = "Jan 02, 2006 15:04";
const t = time.Parse(format, date_string);
const next_day = t.Add(24 * time.Hour);
console.log(`Happy New Year ${next_day.Year()}!`);
const t2 = time.ParseInLocation("2006-01-02", "2025-01-01", "America/Chicago");
console.log(t2.String());
Happy New Year 2026!
2025-01-01 00:00:00 -0600 CST
import * as time from "timedotgo";
// create a time
const christmas = time.DateAt(
2025, // year
12, // month
25, // day
7, // hour
30, // minute
15, // second
928, // millisecond
"America/New_York", // IANA location
);
// create a time from unix timestamp.
const unixZero = time.UnixMilli(0);
console.log(
"It has been",
time.Since(unixZero),
"milliseconds since the creation of unix.",
);
console.log(
"And we only have",
time.Until(christmas),
"milliseconds until Christmas morning.",
);
It has been 1748967303281 milliseconds since the creation of unix.
And we only have 17698512643 milliseconds until Christmas morning.