js日期格式化封装函数
告别手忙脚乱:一行代码搞定 JS 日期格式化的轻量封装
接手旧项目或对接后端接口时,总能在页面渲染逻辑里看到这类代码:data.time.slice(0, 4) + '-' + data.time.slice(5, 7)...。刚接手时觉得挺清晰,过两周再看,连写的人都得对着屏幕数括号。原生的 toLocaleString 看着省事,换个设备或切个浏览器,输出结果经常“翻车”。日期处理看似是基础活儿,却是最容易拖慢迭代节奏的细节。
把重复的拆解动作抽成独立函数,不只是为了少敲几次键盘,更是为了统一团队的展示规范。下面这段封装去掉了冗余的类型守卫,保留了最高频的替换逻辑,直接扔进工具库就能跑。
export function dateFormat(date = new Date(), fmt = 'YYYY-MM-DD HH:mm:ss') {
// 核心:统一转为标准 Date 对象,规避字符串兼容性
const d = typeof date === 'string' ? new Date(date.replace(/-/g, '/')) : date;
if (!(d instanceof Date)) return '';
const map = {
Y: d.getFullYear(), M: d.getMonth() + 1, D: d.getDate(),
H: d.getHours(), h: d.getHours() % 12 || 12, m: d.getMinutes(),
s: d.getSeconds(), A: d.getHours() >= 12 ? 'PM' : 'AM'
};
// 动态匹配占位符并填充
return fmt.replace(/([YMDHhmsA])+/g, m => {
const k = m[0];
// 区分位数:YYYY强制4位,MM/DD/HH等双字符补2位,单字符补1位
const len = m.length === 4 ? 4 : (m.length > 1 ? 2 : 1);
return String(map[k]).padStart(len, '0');
});
}
代码不长,但几个线上高频踩坑点已经提前填平。类型兼容上,接口常返回 ISO8601 字符串或纯数字时间戳,正则里的 replace(/-/g, '/') 专门解决早期 iOS Safari 无法识别横杠分隔日期的顽疾。月份索引是 JS 的设计遗留,底层从 0 开始计数,+1 这一步绝对不能省。零补齐逻辑用 padStart 接棒传统的三元表达式,按占位符长度动态控制补零规则,列表页的时间轴对齐起来干净利落。
实际业务里,展示策略往往分层。列表卡片只需要 MM-DD,详情抽屉才要带秒和上下午。把默认格式抽离成环境配置,或者按模块传入不同模板,调用成本会直线下降。遇到需要强一致性的国际化场景,建议在该函数外层包裹 Intl.DateTimeFormat 做语言兜底,避免硬写星期或农历带来的内存波动。
日常调用就像填空一样直观:
dateFormat('2024-11-05T08:30:00Z', 'MM-DD YYYY') // 11-05 2024
dateFormat(Date.now(), 'HH:mm A') // 16:30 PM
不需要每次临时实例化对象,也不用背诵正则语法,写完直接合入主干,后续维护时不会有人因为漏转一个月而半夜被叫醒。
日期格式化不是炫技的环节,它是产品交互的第一道视觉边界。包得越薄、容错越高,后期排障就越省力。把这套逻辑固化到基础工具层后,你会发现,原本占用半个下午的样式对齐时间,现在只够冲泡一杯咖啡。写代码的本质就是消除不确定性,好用的封装函数,正是把重复劳动挡在门外的那道缓冲垫。


还没有评论,来说两句吧...