手写简易日期格式化和日期解析

300 阅读1分钟

1.日期格式化

function formatDate(date, fmt) {
  if (!(date instanceof Date)) {
    date = new Date()
  }
  if (!fmt) {
    fmt = 'yyyy-MM-dd HH:mm:ss'
  }
  let result = fmt.replace(/h/g, 'H')
  let dateObj = {}
  dateObj['y'] = date.getFullYear()
  dateObj['M'] = date.getMonth()+1
  dateObj['d'] = date.getDate()
  dateObj['H'] = date.getHours()
  if (fmt.indexOf('h')>0 && dateObj['H']>12) {
    dateObj['H'] -= 12
  }
  dateObj['m'] = date.getMinutes()
  dateObj['s'] = date.getSeconds()

  for (let dateKey in dateObj) {
    result = result.replace(new RegExp(dateKey+'+', 'g'), m => {
      let dateVal = dateObj[dateKey] + ''
      if (dateVal.length < 2) {
        dateVal = dateVal.padStart(2, '0')
      }
      if (dateVal.length <= m.length) {
        return dateVal
      }
      return dateVal.slice(dateVal.length-m.length)
    })
  }

  return result
}

2.日期解析

function parseDate(str, fmt) {
  fmt = fmt || 'yyyy-MM-dd HH:mm:ss'
  fmt = fmt.replace(/h/g, 'H')
  let result = ''
  let obj = {y: 0, M: 1, d: 0, H: 0, m: 0, s: 0}
  for (let dateKey in obj) {
    let resArr = new RegExp(dateKey+'+', 'g').exec(fmt)
    obj[dateKey] = Number(str.slice(resArr.index, resArr.index+resArr[0].length))
  }

  // 月份是从0开始的,所以要减去1
  obj.M--
  let date = new Date(obj.y, obj.M, obj.d, obj.H, obj.m, obj.s)

  return date;
}

3.测试

console.log(formatDate(new Date(), 'yy-MM-dd HH:mm:ss'))
console.log(parseDate('2022-11-25 10:25:36', 'yyyy-MM-dd HH:mm:ss'))