Day.js 比 Moment.js 轻因支持 tree-shaking、无依赖、纯函数式设计且插件按需引入;核心仅约2KB,不修改原生 Date,仅用 format 和加减时无需插件。

Day.js 为什么比 Moment.js 轻?关键在 tree-shaking 和无依赖
Day.js 默认只有 2KB 左右,核心模块不修改原生 Date 对象,也不依赖外部库。它用纯函数式 API 设计,所有插件(如 timezone、relativeTime)按需引入——这点直接决定你最终打包体积。如果你只做「格式化字符串」和「加减天数」,dayjs() + .format() 就够了,根本不用 import 插件。
解析日期字符串时,不传格式参数容易出错
Day.js 对模糊字符串(比如 "2023-5-1" 或 "1/2/2023")的解析行为和浏览器原生 Date 一致,但不保证跨浏览器一致。尤其遇到 "2023-05-01T12:30" 这类 ISO 格式以外的输入,建议显式传入格式字符串:
dayjs("2023年5月1日 14:30", "YYYY年M月D日 H:mm")
否则可能返回 invalid date。常见踩坑点:
-
dayjs("2023/05/01")在 Safari 下可能解析失败,而dayjs("2023-05-01")稳定 - 中文、逗号、空格等非标准分隔符必须配格式字符串,不能靠自动推断
- 毫秒级时间戳要写成
dayjs(1712345678900),别传字符串"1712345678900"
格式化输出要注意 locale 和 token 大小写敏感
.format() 的 token 区分大小写:MM 是补零月份,M 是不补零;DD 是补零日期,D 是不补零;HH 是24小时制,hh 是12小时制。中文 locale 需提前加载并设置:
立即学习“前端免费学习笔记(深入)”;
import 'dayjs/locale/zh-cn';<br>dayjs.locale('zh-cn');<br>dayjs().format('YYYY年MM月DD日 HH:mm:ss');
没调用 locale() 就用中文 token,会输出英文(比如 “January”)。另外,format() 不支持自定义时区转换——它只是格式化当前实例的时间值,时区信息来自构造时的环境或 utc()/tz() 插件。
需要时区处理?必须显式引入 timezone 插件
Day.js 核心包默认不带时区能力。想把 UTC 时间转成本地时间,或指定时区格式化,得手动引入插件:
import dayjs from 'dayjs';<br>import utc from 'dayjs/plugin/utc';<br>import timezone from 'dayjs/plugin/timezone';<br>dayjs.extend(utc);<br>dayjs.extend(timezone);<br><br>// 解析为 UTC 时间<br>const d = dayjs.utc("2023-05-01T12:00:00Z");<br>// 转为上海时区<br>d.tz("Asia/Shanghai").format();
注意:tz() 插件依赖 IANA 时区数据库,打包后体积会增加约 150KB(压缩后 ~40KB),如果只做本地时间运算,完全没必要引入。
真正轻量的关键不是“少写几行代码”,而是清楚哪些功能属于核心、哪些是插件、哪些其实根本不需要——比如大部分后台管理系统的日期选择器,只要 format 和 add/subtract,连 locale 都可以砍掉。



















