// YYYY-MM-DD HH:mm:ss
// s = "2022"
// r = moment(s).format('YYYY');
// console.log(r) //
let i = "20220228"; // 输入文本 20 2022 20220 20222 20220228 20220229 202202281
let f = "YYYY-MM-DD"; // 输出格式
// 数字最后是否有输入一个非数字的字符串
let p = i.search(/[\-\.年月日\s]$/) == -1 ? false : true;
// console.log('p: ' + p)
// 用正则替换,只保留8位输入数字
i = i.replace(/[^\d]/g, '').substr(0, 8);
// console.log('输入的数字: "'+ i + '"')
// 格式化输出
o = ""
let formats = f.match(/YYYY|MM|DD/g), // 需要的格式顺序
seps = f.replace(/YYYY|MM|DD/g, '{!}').replace(/^{!}|{!}$/gm,'').split('{!}'), // 分隔符顺序
len = 0, // format长度
cut_str = i, // 待处理输入
sub_str = '', // 截取处理的输入段
is_error = false //输入格式是否有错
;
// console.log('分隔符: ' , seps)
for (let format of formats) {
len = format.length;
if (cut_str.length <= 0) {
break;
}
sub_str = cut_str.substr(0, len);
cut_str = cut_str.substr(len, cut_str.length);
switch (format) {
case 'YYYY': // 年份段
o += sub_str;
break;
case 'MM': // 月份段
if (sub_str.substr(0, 1) > 1) { // 月份段开头输入大于1时,应该格式化成02、03、...、09
if (!moment(sub_str).isValid()) {
is_error = true;
break;
}
o += moment(sub_str).format(format);
} else {
o += sub_str;
}
break;
case 'DD': // 日数段
if (sub_str.length > 1 || sub_str.substr(0, 1) > 2) { // 日数段输入长度大于1时 或者 开头输入大于2时
if (!moment(o + sub_str).isValid()) {
is_error = true;
break;
}
o += moment(o + sub_str).format(format);
} else {
o += sub_str;
}
break;
default:
break;
}
// console.log('剩余数字: "'+ cut_str + '"')
if (is_error) {
break;
}
if (cut_str) {
o += seps.shift();
}
}
if (p && seps.length) {
o += seps.shift();
}
if (is_error) {
console.log("输入格式有错")
}
console.log("输出:"+ o)
console