Day.js需显式初始化并加载format等插件才能调用format(),解析非标准格式须用customParseFormat插件指定模板,中文显示需引入zh-cn locale并提前设置,所有操作返回新实例,原实例不可变。

Day.js 初始化和基础格式化怎么写
Day.js 默认不自动解析字符串,必须显式调用 dayjs() 构造实例,否则直接调用 format() 会报 TypeError: dayjs(...).format is not a function —— 这是因为没引入 format 插件。
基础用法分三步:
- 引入核心库:
<script src="https://cdn.jsdelivr.net/npm/dayjs@1/dayjs.min.js"></script> - 按需加载插件(格式化必需):
<script src="https://cdn.jsdelivr.net/npm/dayjs@1/plugin/customParseFormat.min.js"></script>和<script src="https://cdn.jsdelivr.net/npm/dayjs@1/plugin/advancedFormat.min.js"></script>(后者支持Q、wo等扩展格式) - 注册插件后才能用:
dayjs.extend(window.dayjs_plugin_customParseFormat); dayjs.extend(window.dayjs_plugin_advancedFormat);
之后才可安全调用:dayjs('2023-05-15').format('YYYY-MM-DD') → "2023-05-15"。
解析非标准格式字符串(如 "15/05/2023 14:30")
Day.js 不像 Moment.js 默认支持多格式猜测,遇到 dd/MM/yyyy HH:mm 这类格式必须显式传入模板字符串,否则解析结果为 Invalid Date。
立即学习“前端免费学习笔记(深入)”;
正确做法是用 customParseFormat 插件 + 显式格式声明:
dayjs('15/05/2023 14:30', 'DD/MM/YYYY HH:mm')
注意点:
- 格式字母大小写敏感:
mm是分钟,MM是月份;dd是星期几缩写,DD才是日期 - 空格和分隔符需完全匹配,
'DD-MM-YYYY'无法解析"15/05/2023" - 若原始字符串带时区(如
"2023-05-15T14:30:00+08:00"),无需插件,dayjs('2023-05-15T14:30:00+08:00')可直接识别
本地化中文显示(星期、月份名)
Day.js 默认输出英文,要显示“星期一”“一月”,必须加载中文语言包并设置全局或实例级 locale。
步骤:
- 引入中文包:
<script src="https://cdn.jsdelivr.net/npm/dayjs@1/locale/zh-cn.min.js"></script> - 设置全局:
dayjs.locale('zh-cn')(影响所有后续实例) - 或局部设置:
dayjs().locale('zh-cn').format('dddd MMMM')→"星期一 五月"
注意:zh-cn 包不含农历、节气等扩展功能,需要额外插件;且 locale 必须在 format() 前调用,顺序颠倒无效。
避免 mutate 原始日期对象的常见误用
Day.js 实例是不可变的(immutable),所有修改方法(如 add()、startOf())都返回新实例,原实例不变。新手常误以为链式调用会改变自身,导致逻辑错误。
比如:
const d = dayjs('2023-01-01');
d.add(1, 'month'); // ❌ 返回新实例,但未赋值,d 仍是 2023-01-01
console.log(d.format()); // "2023-01-01"
正确写法:
- 链式调用没问题:
dayjs('2023-01-01').add(1, 'month').format() - 需复用时必须重新赋值:
let d = dayjs('2023-01-01'); d = d.add(1, 'month'); - 误用
set()或hour()等 setter 方法也会返回新实例,不是就地修改
这个不可变特性是 Day.js 轻量的关键,但也意味着不能像原生 Date 那样反复 setHours() 修改——每次都是新对象。



















