UNPKG

locutus

Version:

Locutus other languages' standard libraries to JavaScript for fun and educational purposes

40 lines (39 loc) 2.15 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Date = Date; // biome-ignore lint/suspicious/noShadowRestrictedNames: Go API compatibility requires exported Date symbol. 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); }