利用函数参数归一化实现日期格式化函数

168 阅读2分钟

一、什么是函数参数的归一化?

函数归一化(Function Normalization)是一种将不同形态的输入参数转化为统一处理模式的设计思想, 能有效减少条件分支的代码。

二、利用函数归一化实现日期格式函数

function _formatNormalize(formatter) {
  const defaultFormat = {
    date: "YYYY/MM/DD",
    datetime: "YYYY/MM/DD hh:mm:ss",
    time: "hh:mm:ss",
  }
  if (typeof formatter === "string") {
    return (dateInfo) => (defaultFormat[formatter] || formatter).replace(/YYYY|MM|DD|hh|mm|ss/g, match => dateInfo[match]);
  } else if (typeof formatter === "function") {
    return formatter;
  } else {
    console.error("formatter格式错误!")
  }
}

/**
 * 格式化一个日期
 * @param {Date} date 日期对象
 * @param {String} formatter 格式
 * @param {Boolean} isPad 是否补位
 */
function dateForamte(date, foramtter, isPad = true) {
  const dateInfo = {
    "YYYY": date.getFullYear(),
    "MM": date.getMonth() + 1,
    "DD": date.getDate(),
    "hh": date.getHours(),
    "mm": date.getMinutes(),
    "ss": date.getSeconds(),
  }

  for (key in dateInfo) {
    dateInfo[key] = String(dateInfo[key]);
  }

  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);
  }

  // 全部归一成函数
  return _formatNormalize(foramtter, isPad)(dateInfo);
}

// examples
dateForamte(new Date(), "date"); //2025/02/24
dateForamte(new Date(), "datetime");// 2025/02/24 20:22:19
dateForamte(new Date(), "time"); //20:22:19
dateForamte(new Date(), "YYYY-MM-DD"); //2025-02-24
dateForamte(new Date(), "YYYY/MM/DD hh:mm"); //2025/02/24 20:22

上面的代码中有两处归一化,一个是将函数的各种类型的参数通过_formatNormalize归一成函数,还有一个是将字符串类型的参数都归一成"YYYY/MM/DD"的格式。

三、相关知识

  • String.prototype.padStart是ES6引入的字符串方法,用于将当前字符串用另一个字符串填充到指定长度,从开头开始填充。例如,'5'.padStart(2, '0')会得到'05'。这在处理日期、时间补零的时候非常有用,比如月份显示为两位数字。
  • Js中的月份是从0开始的
  • 函数参数的归一化是将不同的函数参数类型归纳为一类进行处理