参数归一化:把不同的参数情况转化为最终的一种情况,后续可以按照这一种情况进行处理,从而让事情变得非常的有条理。
function _formatNormalize(formatter) {
if (typeof formatter === "function") {
return formatter;
}
if (typeof formatter !== "string") {
throw new TypeError("formatter must be a string");
}
if (formatter === "date") {
formatter = "yyyy-MM-dd";
}
if (formatter === "datetime") {
formatter = "yyyy-MM-dd HH:mm:ss";
}
const formatterFun = (dataInfo) => {
const { yyyy, MM, dd, HH, mm, ss, ms } = dataInfo;
return formatter
.replaceAll("yyyy", yyyy)
.replaceAll("MM", MM)
.replaceAll('dd',dd)
.replaceAll('HH',HH)
.replaceAll('mm',mm)
.replaceAll('ss',ss)
.replaceAll('ms',ms)
};
return formatterFun
}
/**
* 格式化一个日期
* @params date {Date} 时间对象
* @params formatter {String|Function} 格式化字符串或自定义函数
* @params isPad {Boolearn} 是否补全位数
*/
function formate(date, formatter, isPad = false) {
formatter=_formatNormalize(formatter);
const dateInfo={
yyyy:date.getFullYear().toString(),
MM:(date.getMonth()+1).toString(),
dd:date.getDate().toString(),
HH:date.getHours().toString(),
mm:date.getMinutes().toString(),
ss:date.getSeconds().toString(),
ms:date.getMilliseconds().toString()
}
function _pad(prop,len){
dateInfo[prop]=dateInfo[prop].padStart(len,'0');
}
if(isPad){
_pad('yyyy',4);
_pad('MM',2);
_pad('dd',2);
_pad('HH',2);
_pad('mm',2);
_pad('ss',2);
_pad('ms',2);
};
const result= formatter(dateInfo);
console.log(result)
return result
}
formate(new Date(), "date"); // 2024-7-27
formate(new Date(), "datetime"); // 2024-7-27 19:39:49
formate(new Date(), "date", true); // 2024-07-27
formate(new Date(), "datetime", true); // 2024-07-27 19:39:49
formate(new Date(), "yyyy年MM月dd日 HH:mm:ss.ms"); // 2024年7月27日 19:39:49.18
formate(new Date(), (dataInfo) => { // 今年
const { year } = dataInfo;
const thisYear = new Date().getFullYear();
if (year < thisYear) {
return `${thisYear - year}年前`;
} else if (year > thisYear) {
return `${year - thisYear}年后`;
} else {
return "今年";
}
});