参数归一化:把不同的参数情况转化为最终的一种情况,后续可以按照这一种情况进行处理,从而让事情变得非常的有条理。
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 "今年";
    }
});

标签: 暂无标签