UNPKG

jtc-utils

Version:
75 lines (74 loc) 2.8 kB
import { isValid, parse, parseISO } from "date-fns"; import { JapaneseEra } from "./JapaneseEra.mjs"; import { enUS, ja } from "./locale/index.mjs"; import { DateFormat } from "./util/DateFormat.mjs"; import { getLocale } from "./util/getLocale.mjs"; import { getTimeZone } from "./util/getTimeZone.mjs"; import { getTimeZoneOffset } from "./util/getTimeZoneOffset.mjs"; export function parseDate(str, format, options) { if (str == null) { return undefined; } const locale = options?.locale ?? (/^ja(-|$)/i.test(getLocale()) ? ja : enUS); const timeZone = options?.timeZone; try { let dDate; if (!format) { dDate = parseISO(str); if (!isValid(dDate)) { return null; } if (timeZone && timeZone !== getTimeZone() && !/(Z|[+-][0-9]{2}(:?[0-9]{2})?)$/.test(str)) { dDate = new Date(dDate.getTime() + getTimeZoneOffset(dDate, timeZone)); } } else { const parseOptions = { locale }; let era; if (locale.code && /^ja-JP-u-ca-japanese$/i.test(locale.code)) { parseOptions.locale = { ...locale, match: { ...locale.match, era(dateString, options) { let m; if ((m = /^([MTSHR]|明治?|大正?|昭和?|平成?|令和?)/.exec(dateString)) != null) { era = JapaneseEra.from(m[0], { locale: "ja" }); return { value: 1, rest: dateString.substring(m[0].length), }; } else { return locale.match?.era(dateString, options); } }, }, }; } dDate = parse(str, format, new Date(), parseOptions); if (!isValid(dDate)) { return null; } if (era) { dDate.setFullYear(dDate.getFullYear() + era.start.getFullYear() - 1); } if (timeZone && timeZone !== getTimeZone() && !DateFormat.get(format).parts.some((part) => part.type === "pattern" && /^[xX]/.test(part.text))) { dDate = new Date(dDate.getTime() + getTimeZoneOffset(dDate, timeZone)); } } return dDate; } catch (err) { if (err instanceof RangeError) { return null; } else { throw err; } } }