分享一个自己写的JS日期时间格式化函数,欢迎讨论优化
web前端来说,基本上离不开日期时间格式,为了日常调用方便,自己写了一个函数,如有雷同,纯属巧合。根据flexible参数是否为true,可以返回标准的格式化时间,或灵活的人性化显示时间,具体如下。
如有优化建议,欢迎各位大佬交流、指正。
/*
函数功能:格式化日期时间,支持自定义格式,支持人性化显示(刚刚、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');
// 如果是今年,则将 format 仅保留月、日、时、分、秒(未返回)
} else if (config.YYYY == now.getFullYear()) {
format = 'MM' + format.split('MM');
}
}
// 如果到这里都未返回,则按 format 返回格式时间
for (const key in config) {
format = format.replace(key, config);
}
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的属性,不知道什么原因。
format = format.replace(/(YYYY|MM|DD|HH|mm|ss)/g, config['$&']);
楼主写的还是不错的,定义 config 那里,在时分秒的处理上,建议封装一个函数处理
const formatHMS = num => `${num < 10? '0' : ''}${num}`
const config = {
// ...
HH:formatHMS(date.getHours())
}
关于楼主最后一个疑问,replace 函数的第二个参数其实是可以接受函数的,所以最后可以不用 for...in 循环,直接使用正则替换即可
format.replace(/(YYYY|MM|DD|HH|mm|ss)/g, (key) => config) 楼里楼气的了 ??没有演示 CHANGCHEN 发表于 2021-11-1 17:46
??没有演示
有调用示例哦 我平时项目直接用moment.js搞定所有{:301_1004:} rxxcy 发表于 2021-11-1 17:37
楼里楼气的了
漏里漏气可还行{:301_1001:} 攒劲,支持,;厉害 混淆一下吧,不然不习惯 感谢分享 format.replace(/(YYYY|MM|DD|HH|mm|ss)/g, function(m){
return config
});
页:
[1]
2