后端接口返回 2026-10-31T08:30:00.000Z 这样一串,要展示成 2026-10-31 08:30,自己拼字符串又容易在月份补零上翻车。这类活儿交给 day.js,2KB 左右的体积,API 和 moment 基本一致,从老项目迁过来成本很低。

格式化:format 一把梭

import dayjs from 'dayjs'; dayjs(); dayjs().format('YYYY-MM-DD HH:mm:ss'); dayjs('2026/10/31').format('YYYY年MM月DD日');

年月日时分秒各对应一个字母,MM 是月、mm 是分,大小写别搞混。解析传入的字符串格式尽量规范,iOS 的 Safari 对 2026-10-31 这种横杠格式支持不好,遇到兼容问题先统一替换成斜杠。

加减和比较

dayjs().add(7, 'day'); dayjs().subtract(2, 'hour'); dayjs('2026-11-11').diff(dayjs(), 'day');

add 和 subtract 不改原对象,返回新实例,链着用没问题。判断先后用 isBefore、isAfter、isSame,比较两个日期是不是同一天,isSame 的第二个参数传 day 就行。

中文环境和 day.js 插件

引入 dayjs/locale/zh-cn 再调用 dayjs.locale('zh-cn'),周几、上午下午这些输出就是中文。想显示「3 分钟前」这种相对时间,加 relativeTime 插件配合 fromNow 用。插件按需引入,不用的不加载,这也是它体积能压住的原因。

一个实际提醒:dayjs 对象别直接塞进状态管理长期复用,跨组件传日期建议传字符串或时间戳,用的时候再包一层 dayjs,能省掉不少玄学 bug。