jtc-utils
Version:
Utilities for Japanese Traditional Companies
78 lines • 3.19 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseDate = parseDate;
const date_fns_1 = require("date-fns");
const JapaneseEra_ts_1 = require("./JapaneseEra.js");
const index_ts_1 = require("./locale/index.js");
const DateFormat_ts_1 = require("./util/DateFormat.js");
const getLocale_ts_1 = require("./util/getLocale.js");
const getTimeZone_ts_1 = require("./util/getTimeZone.js");
const getTimeZoneOffset_ts_1 = require("./util/getTimeZoneOffset.js");
function parseDate(str, format, options) {
if (str == null) {
return undefined;
}
const locale = options?.locale ?? (/^ja(-|$)/i.test((0, getLocale_ts_1.getLocale)()) ? index_ts_1.ja : index_ts_1.enUS);
const timeZone = options?.timeZone;
try {
let dDate;
if (!format) {
dDate = (0, date_fns_1.parseISO)(str);
if (!(0, date_fns_1.isValid)(dDate)) {
return null;
}
if (timeZone &&
timeZone !== (0, getTimeZone_ts_1.getTimeZone)() &&
!/(Z|[+-][0-9]{2}(:?[0-9]{2})?)$/.test(str)) {
dDate = new Date(dDate.getTime() + (0, getTimeZoneOffset_ts_1.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_ts_1.JapaneseEra.from(m[0], { locale: "ja" });
return {
value: 1,
rest: dateString.substring(m[0].length),
};
}
else {
return locale.match?.era(dateString, options);
}
},
},
};
}
dDate = (0, date_fns_1.parse)(str, format, new Date(), parseOptions);
if (!(0, date_fns_1.isValid)(dDate)) {
return null;
}
if (era) {
dDate.setFullYear(dDate.getFullYear() + era.start.getFullYear() - 1);
}
if (timeZone &&
timeZone !== (0, getTimeZone_ts_1.getTimeZone)() &&
!DateFormat_ts_1.DateFormat.get(format).parts.some((part) => part.type === "pattern" && /^[xX]/.test(part.text))) {
dDate = new Date(dDate.getTime() + (0, getTimeZoneOffset_ts_1.getTimeZoneOffset)(dDate, timeZone));
}
}
return dDate;
}
catch (err) {
if (err instanceof RangeError) {
return null;
}
else {
throw err;
}
}
}
//# sourceMappingURL=parseDate.js.map