dateFormat获取日期参数归一化

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 formatFunc = (dateInfo) => {
    const {yyyy, MM, dd, HH, mm, ss, ms} = dateInfo
    return formatter
      .replaceAll('yyyy', yyyy)
      .replaceAll('MM', MM)
      .replaceAll('dd', dd)
      .replaceAll('HH', HH)
      .replaceAll('mm', mm)
      .replaceAll('ss', ss)
      .replaceAll('ms', ms)
  }
  return formatFunc
}

/**
 * 返回一个格式化日期
 * @param date Date类型
 * @param formatter date || datetime || yyyy年MM月dd日 HH:mm:ss(指定日期格式) || 自定义函数
 * @param isPad 是否补零
 */
function formatDate(date, formatter, isPad = false) {
  if (!(date instanceof Date)) {
    throw new TypeError('argument date must be a Date')
  }
  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', 3)
  }
  const result = formatter(dateInfo)
  console.log(result)
  return result
}

formatDate(new Date(), 'date') //2024-7-27
formatDate(new Date(), 'date', true) //2024-07-27
formatDate(new Date(), 'datetime') //2024-7-27 11:37:46
formatDate(new Date(), 'datetime', true) //2024-07-27 11:37:46
formatDate(new Date(), 'yyyy年MM月dd日 HH:mm:ss.ms', true) //2024年07月27日 11:37:46.135
formatDate(new Date('2022-12-1'), (dateInfo) => {
  const {yyyy} = dateInfo
  const thisYear = new Date().getFullYear()
  if (thisYear < yyyy) {
    return `${yyyy - thisYear}年后`
  } else if (thisYear > yyyy) {
    return `${thisYear - yyyy}年前`
  } else {
    return '今年'
  }
}) //2年前

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值