/**
* 将时间转换为指定格式的字符串
* @param {Date|string|number} time - 要转换的时间,可以是 Date 对象、表示时间的字符串或数字
* @param {string} pattern - 转换的格式模式,默认为 '{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}'
* @returns {string} - 格式化后的时间字符串
*/
function parseTime(time, pattern = '{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}') {
if (!time) {
throw new TypeError('illegal time value');
}
if (typeof pattern !== 'string') {
throw new TypeError("'pattern' must be of type string");
}
if (pattern === "date") {
pattern = '{yyyy}-{MM}-{dd}'
} else if (pattern === "datetime") {
pattern = '{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}'
}
let date;
// 将传入的time转为Date类型
if (time instanceof Date) {
date = time;
} else if (typeof time === 'string') {
// 如果是纯数字组成的字符串
if (/^\d+$/.test(time)) {
time = parseInt(time);
date = new Date(time);
} else {
date = new Date(time);
// Date与原始类型比较时会先调用toString
if (date == 'Invalid Date') {
throw new TypeError('unable to convert string');
}
}
} else if (typeof time === 'number' && time >= 0) {
// 如果是大于零的数字
date = new Date(time)
} else {
throw new TypeError('unrecognized type');
}
const formatObj = {
y: date.getFullYear(),
M: date.getMonth() + 1,
d: date.getDate(),
H: date.getHours(),
m: date.getMinutes(),
s: date.getSeconds(),
ms: date.getMilliseconds(),
a: date.getDay()
}
const timeStr = pattern.replace(/{(y+|M+|d+|H+|m+|s+|ms|a)}/g, (result, key) => {
let value;
if (key === "ms") {
return formatObj[key];
} else if (key[0] === "y") {
value = formatObj[key[0]];
value = value % (10 ** key.length);
} else if (key === "a") {
value = formatObj[key];
return ['日', '一', '二', '三', '四', '五', '六'][value];
} else {
value = formatObj[key[0]];
}
return value.toString().padStart(key.length, '0');
})
return timeStr;
}
第一步:将time转换为Date类型,分情况讨论。
如果time本身就是Date类型,直接赋值。
如果time是字符串且由纯数字组成,将字符串转成数字再调用构造函数。否则直接调用构造函数。
考虑转换失败的情况,Date与基本类型进行==判断时会先调用toString方法。
如果time是不小于0的数字,直接调用构造函数。
第二步:定义一个formatObj方便以后调用。
第三步:考虑pattern的特殊情况,如果pattern是"date"或"datetime",先将其转换为统一的格式。
第四步:模式替换。
注意点:正则表达式里的加号不能写在括号外面,就以y、s、ms为例。
const text = "{ysms}-{ss}-{yyys}";
paragraph.replace(/{(y|s|ms)+}/g, (result, key) => {
console.log("result:", result, "key:", key);
});
/*
输出结果
> "result:" "{ysms}" "key:" "ms"
> "result:" "{ss}" "key:" "s"
> "result:" "{yyys}" "key:" "s"
*/
在正则表达式 {(y|s|ms)+}
中,+
表示匹配前面的子表达式一次或多次。而 (y|s|ms)
是一个捕获组,表示匹配 y、s 或 ms 中的任何一个。
因此,表达式 {(y|s|ms)+}
可以匹配多次重复的 y、s 或 ms 组合。例如,它可以匹配 "yyyy", "ss", "msms", "ysys", "yssy", "yyys", 等等。