web前端来说,基本上离不开日期时间格式,为了日常调用方便,自己写了一个函数,如有雷同,纯属巧合。
根据flexible参数是否为true,可以返回标准的格式化时间,或灵活的人性化显示时间,具体如下。
如有优化建议,欢迎各位大佬交流、指正。
[JavaScript] 纯文本查看 复制代码 /*
函数功能:格式化日期时间,支持自定义格式,支持人性化显示(刚刚、X分钟前、今天、今年)
参数:
data 需要处理的时间戳、时间日期字符串等
format 自定义格式(有默认值)
flexible 是否人性化模式
*/
function formatDate(date, format = 'YYYY-MM-DD HH:mm:ss', flexible = false) {
// 构建时间,并声明各时间变量(时分秒补零)
date = new Date(date);
const config = {
YYYY: date.getFullYear(),
MM: date.getMonth() + 1,
DD: date.getDate(),
HH: date.getHours() < 10 ? '0' + date.getHours() : date.getHours(),
mm: date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes(),
ss: date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
};
// 如果是人性化模式
if (flexible) {
// 构建现在时间,并计算现在时间与需处理时间的相差分钟数
const now = new Date(),
count = ((now - date) / 1000 / 60);
// 如果小于5分钟,则返回 “刚刚”
if (count >= 0 && count < 5) {
return '刚刚';
// 如果小于60分钟,则返回 “*分钟前”
} else if (count >= 5 && count < 60) {
return Math.round(count) + '分钟前';
// 如果是今天,则将 format 仅保留时、分、秒(未返回)
} else if (date.toDateString() === now.toDateString()) {
format = 'HH' + format.split('HH')[1];
// 如果是今年,则将 format 仅保留月、日、时、分、秒(未返回)
} else if (config.YYYY == now.getFullYear()) {
format = 'MM' + format.split('MM')[1];
}
}
// 如果到这里都未返回,则按 format 返回格式时间
for (const key in config) {
format = format.replace(key, config[key]);
}
return format;
}
// ===== 调用 =====
// 标准格式
console.log(formatDate('2021-11-1 14:05:08', 'YYYY年MM月DD日 HH时mm分ss秒'));
// 灵活格式
console.log(formatDate('2020-8-6 9:01:06', 'YYYY年MM月DD日 HH:mm', true));
其实这里有个问题,就是最后的for循环替换那里,我尝试用正则实现一行代码完成替换,无法引用到config的属性,不知道什么原因。
[JavaScript] 纯文本查看 复制代码 format = format.replace(/(YYYY|MM|DD|HH|mm|ss)/g, config['$&']);
|