高效,易读.
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(''); }