UNPKG

@fable-org/fable-library-js

Version:

Core library used by F# projects compiled with fable.io

125 lines (124 loc) 3.88 kB
import { DateTime, getTicks, dayOfYear as Date_dayOfYear, year as Date_year, month as Date_month, day as Date_day, daysInMonth as Date_daysInMonth, ticksToUnixEpochMilliseconds } from "./Date.js"; import { padWithZeros } from "./Util.js"; export function fromUnixMilliseconds(value) { return DateTime(value, 1 /* DateKind.UTC */); } export function create(year, month, day) { const d = fromUnixMilliseconds(Date.UTC(year, month - 1, day)); if (year <= 99) { d.setUTCFullYear(year); } return d; } export function maxValue() { // This is "9999-12-31T00:00:00.000Z" return fromUnixMilliseconds(253402214400000); } export function minValue() { // This is "0001-01-01T00:00:00.000Z" return fromUnixMilliseconds(-62135596800000); } export function dayNumber(d) { return Number((getTicks(d) / 864000000000n)); } export function fromDayNumber(dayNumber) { const ticks = 864000000000n * BigInt(dayNumber); return fromUnixMilliseconds(ticksToUnixEpochMilliseconds(ticks)); } export function fromDateTime(d) { return create(Date_year(d), Date_month(d), Date_day(d)); } export function day(d) { return d.getUTCDate(); } export function month(d) { return d.getUTCMonth() + 1; } export function year(d) { return d.getUTCFullYear(); } export function dayOfWeek(d) { return d.getUTCDay(); } export function dayOfYear(d) { return Date_dayOfYear(d); } export function toDateTime(d, time, kind = 0 /* DateKind.Unspecified */) { return DateTime(d.getTime() + time + (kind !== 1 /* DateKind.UTC */ ? d.getTimezoneOffset() : 0) * 60000, kind); } export function toString(d, format = "d", _provider) { if (["d", "o", "O"].indexOf(format) === -1) { throw new Error("Custom formats are not supported"); } const y = padWithZeros(year(d), 4); const m = padWithZeros(month(d), 2); const dd = padWithZeros(day(d), 2); return format === "d" ? `${m}/${dd}/${y}` : `${y}-${m}-${dd}`; } export function parse(str) { function fail() { throw new Error(`String '${str}' was not recognized as a valid DateOnly.`); } // Allowed separators: . , / - // TODO whitespace alone as the separator // // Whitespace around separators // // Allowed format types: // yyyy/mm/dd // mm/dd/yyyy // mm/dd // mm/yyyy // yyyy/mm const r = /^\s*(\d{1,4})(?:\s*[.,-\/]\s*(\d{1,2}))?\s*[.,-\/]\s*(\d{1,4})\s*$/.exec(str); if (r != null) { let y = 0; let m = 0; let d = 1; if (r[2] == null) { if (r[1].length < 3) { if (r[3].length < 3) { // 12/30 = December 30, {CurrentYear} y = new Date().getFullYear(); m = +r[1]; d = +r[3]; } else { // 12/2000 = December 1, 2000 m = +r[1]; y = +r[3]; } } else { if (r[3].length > 2) fail(); // 2000/12 = December 1, 2000 y = +r[1]; m = +r[3]; } } else { // 2000/1/30 or 1/30/2000 const yearFirst = r[1].length > 2; const yTmp = r[yearFirst ? 1 : 3]; y = +yTmp; // year 0-29 is 2000-2029, 30-99 is 1930-1999 if (yTmp.length < 3) y += y >= 30 ? 1900 : 2000; m = +r[yearFirst ? 2 : 1]; d = +r[yearFirst ? 3 : 2]; } if (y > 0 && m > 0 && m < 13 && d > 0 && d <= Date_daysInMonth(y, m)) return create(y, m, d); } return fail(); } export function tryParse(v, defValue) { try { defValue.contents = parse(v); return true; } catch { return false; } }