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年前
dateFormat获取日期参数归一化
于 2024-07-27 11:44:25 首次发布