38 lines
1.2 KiB
Plaintext
38 lines
1.2 KiB
Plaintext
import units from "./units.mjs";
|
|
const { YEAR, MONTH, DATE, HOUR, MINUTE, SECOND, MILLISECOND, UTC_OFFSET } = units;
|
|
function escapeRegex(str) {
|
|
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
}
|
|
const TOKEN_MAP = {
|
|
YYYY: { pattern: "(\\d{1,4})", key: YEAR },
|
|
// 年份
|
|
// YY: { pattern: '(\\d{1,2})', key: YEAR }, // 年份
|
|
MM: { pattern: "(\\d{1,2})", key: MONTH },
|
|
// 月份
|
|
DD: { pattern: "(\\d{1,2})", key: DATE },
|
|
// 日期
|
|
HH: { pattern: "(\\d{1,2})", key: HOUR },
|
|
// 小时
|
|
mm: { pattern: "(\\d{1,2})", key: MINUTE },
|
|
// 分钟
|
|
ss: { pattern: "(\\d{1,2})", key: SECOND },
|
|
// 秒
|
|
SSS: { pattern: "(\\d{1,3})", key: MILLISECOND },
|
|
// 毫秒
|
|
Z: { pattern: "(Z|[+-]\\d{2}(?::?\\d{2})?)", key: UTC_OFFSET }
|
|
// 时区
|
|
};
|
|
const TOKEN_KEYS = Object.keys(TOKEN_MAP).sort((a, b) => b.length - a.length);
|
|
const TOKEN_PATTERN = new RegExp(`(${TOKEN_KEYS.join("|")})`, "g");
|
|
function compile(formatString) {
|
|
const matchedTokens = [];
|
|
const pattern = escapeRegex(formatString).replace(TOKEN_PATTERN, (m) => {
|
|
matchedTokens.push(m);
|
|
return TOKEN_MAP[m].pattern;
|
|
});
|
|
return { pattern, tokens: matchedTokens };
|
|
}
|
|
export {
|
|
compile as default
|
|
};
|