Skip to main content

使用参数归一化的方式实现日期格式化函数

formatDate.js内容如下:

/**
* @description: 返回格式化的日期
* @param {*} date 日期对象,如new Date()
* @param {*} formatter 格式化格式,如'date','datetime','yyyy-MM-dd','yyyy-MM-dd HH:mm:ss','yyyy年MM月dd HH:mm:ss'
* @param {*} isPad
* @return {*}
*/
function format(date, formatter, isPad = true) {
// 参数归一化
formatter = _formatNormalize(formatter)
// 分解日期各个部分
const dateInfo = {
year: date.getFullYear(),
month: date.getMonth() + 1,
date: date.getDate(),
hour: date.getHours(),
minute: date.getMinutes(),
second: date.getSeconds(),
millisecond: date.getMilliseconds()
}
// 拼接转换格式所需要的结构
dateInfo.yyyy = dateInfo.year.toString()
dateInfo.MM = dateInfo.month.toString()
dateInfo.dd = dateInfo.date.toString()
dateInfo.HH = dateInfo.hour.toString()
dateInfo.mm = dateInfo.minute.toString()
dateInfo.ss = dateInfo.second.toString()
dateInfo.ms = dateInfo.millisecond.toString()
/**
* @description: 使用0填充字符串
* @param {*} prop
* @param {*} len
* @return {*}
*/
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)
return result
}
/**
* @description: 参数归一化,将参数归一化为函数
* @param {*} dateInfo
* @return {*}
*/
function _formatNormalize(formatter) {
// 如果是函数,直接返回
if (typeof formatter === 'function') return formatter
// 如果不是函数,则判断是否是字符串,如果是字符串,则根据字符串进行格式化,否则抛出错误
if (typeof formatter !== 'string') throw new Error('formatter must be a function or a string')
// 默认的两种参数格式,最终都会转换成有yyyy、MM、dd等的格式
if (formatter === 'date') formatter = 'yyyy-MM-dd'
else if (formatter === 'datetime') formatter = 'yyyy-MM-dd HH:mm:ss'
// 将字符串中的yyyy、MM、dd等,使用dateInfo中的值进行替换
const formatterFunc = (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 formatterFunc
}

export default { format }

使用方法:

import formatDate from '@/utils/formatDate'
formatDate.format(new Date(), 'date')
formatDate.format(new Date(), 'datetime')
formatDate.format(new Date(), 'yyyy-MM-dd HH.mm.ss')
formatDate.format(new Date(), 'yyyy年MM月dd HH:mm:ss')