高效,易读.
1. 高效代码,一次遍历,时间复杂度为O(n) (不追求性能可以直接用replace)
2. 日期解析,使用解构
3. 逐个字符进行处理, 匹配一位和两位字符数据。
4. 需要对yy和yyyy进行特殊处理
function formatDate(dat, format) {
let [
yyyy, M, d, H, m, s, w
] = [
dat.getFullYear() + '',
(dat.getMonth() + 1) + '',
dat.getDate() + '',
dat.getHours() + '',
dat.getMinutes() + '',
dat.getSeconds() + '',
['日', '一', '二', '三', '四', '五', '六'][dat.getDay()],
];
// 使用padStart方法,如果不足两位,前面补0
// let pad = (str, len) => str.padStart(len, '0');
let pad = (str, len) => ('0' + str).slice(-2);
let datMap = {
yyyy: yyyy,
yy: yyyy.slice(2),
MM: pad(M, 2),
M,
dd: pad(d, 2),
d: d,
HH: pad(H, 2),
H: H,
hh: pad(H % 12 + '', 2),
h: (H % 12 + ''),
mm: pad(m, 2),
m,
ss: pad(s, 2),
s,
w
};
let firstChar = '';
let yNum = 0;
let res = [];
for (let c of format) {
if (c == 'y') {
if (firstChar) {
res.push(datMap[firstChar] || firstChar);
firstChar = '';
}
yNum++;
} else {
// 处理y字符, yy,yyyy对应数据.
res.push(datMap['y'.repeat(yNum)] || 'y'.repeat(yNum));
yNum = 0;
// 处理非y字符, 2位字符合并
if (!datMap[c]) {
if (firstChar) {
res.push(datMap[firstChar] || firstChar);
firstChar = '';
}
res.push(c);
} else {
if (!firstChar) firstChar = c;
else {
if (firstChar != c) {
res.push(datMap[firstChar]);
firstChar = c;
} else {
res.push(datMap[c + c] || (c + c));
firstChar = '';
}
}
}
}
}
if (firstChar) res.push(datMap[firstChar] || firstChar);
return res.join('');
}



京公网安备 11010502036488号