js日期格式化封装函数

2026-05-31 06:00:30 1113阅读 0评论

告别手忙脚乱:一行代码搞定 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

不需要每次临时实例化对象,也不用背诵正则语法,写完直接合入主干,后续维护时不会有人因为漏转一个月而半夜被叫醒。

日期格式化不是炫技的环节,它是产品交互的第一道视觉边界。包得越薄、容错越高,后期排障就越省力。把这套逻辑固化到基础工具层后,你会发现,原本占用半个下午的样式对齐时间,现在只够冲泡一杯咖啡。写代码的本质就是消除不确定性,好用的封装函数,正是把重复劳动挡在门外的那道缓冲垫。

文章版权声明:除非注明,否则均为Dark零点博客原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
验证码
评论列表 (暂无评论,1113人围观)

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

目录[+]