locutus
Version:
Locutus other languages' standard libraries to JavaScript for fun and educational purposes
37 lines (36 loc) • 2.06 kB
JavaScript
// biome-ignore lint/suspicious/noShadowRestrictedNames: Go API compatibility requires exported Date symbol.
export function Date(year, month, day, hour, minute, second, nsec, offsetMinutes = 0) {
// discuss at: https://locutus.io/golang/time/Date
// parity verified: Go 1.23
// original by: Kevin van Zonneveld (https://kvz.io)
// note 1: Builds an absolute JavaScript Date from Go-style date parts.
// note 2: `offsetMinutes` is east-of-UTC, matching Go FixedZone offset behavior.
// example 1: Date(2026, 3, 3, 13, 14, 15, 0, 0).toISOString()
// returns 1: '2026-03-03T13:14:15.000Z'
// example 2: Date(2026, 3, 3, 13, 14, 15, 500000000, 0).toISOString()
// returns 2: '2026-03-03T13:14:15.500Z'
// example 3: Date(2026, 3, 3, 13, 14, 15, 0, 150).toISOString()
// returns 3: '2026-03-03T10:44:15.000Z'
const resolvedYear = Math.trunc(Number(year));
const resolvedMonth = Math.trunc(Number(month));
const resolvedDay = Math.trunc(Number(day));
const resolvedHour = Math.trunc(Number(hour));
const resolvedMinute = Math.trunc(Number(minute));
const resolvedSecond = Math.trunc(Number(second));
const resolvedNsec = Math.trunc(Number(nsec));
const resolvedOffsetMinutes = Math.trunc(Number(offsetMinutes));
if (!Number.isFinite(resolvedYear) ||
!Number.isFinite(resolvedMonth) ||
!Number.isFinite(resolvedDay) ||
!Number.isFinite(resolvedHour) ||
!Number.isFinite(resolvedMinute) ||
!Number.isFinite(resolvedSecond) ||
!Number.isFinite(resolvedNsec) ||
!Number.isFinite(resolvedOffsetMinutes)) {
throw new TypeError('Date(): invalid datetime components');
}
const millis = Math.trunc(resolvedNsec / 1_000_000);
const utcMillis = globalThis.Date.UTC(resolvedYear, resolvedMonth - 1, resolvedDay, resolvedHour, resolvedMinute, resolvedSecond, millis) -
resolvedOffsetMinutes * 60_000;
return new globalThis.Date(utcMillis);
}