
Day.js 默认按国际通用规则解析 MM/DD/YYYY 格式字符串(如 "01/02/2000"),即使已设置 en-gb 本地化,也不会自动按 DD/MM/YYYY 解析——必须显式指定解析格式。
day.js 默认按国际通用规则解析 `mm/dd/yyyy` 格式字符串(如 `"01/02/2000"`),即使已设置 `en-gb` 本地化,也不会自动按 `dd/mm/yyyy` 解析——必须显式指定解析格式。
Day.js 的 locale 配置仅影响显示格式(如 format() 输出)和相对时间、星期/月份名称等本地化内容,并不改变字符串解析时的默认格式规则。这是关键认知误区。
当传入形如 '01/02/2000' 的字符串时,Day.js 内部使用原生 Date 构造函数或轻量级解析器,默认遵循 M/D/Y(月/日/年)顺序——这是 JavaScript 规范及 ISO 8601 兼容解析的常见约定(尤其对 / 分隔符)。因此 '01/02/2000' 总被解析为 2000年1月2日,而非英国习惯的 2000年2月1日。
✅ 正确做法:使用 dayjs(String, String) 显式指定输入格式:
import dayjs from 'dayjs';
import 'dayjs/locale/en-gb';
dayjs.locale('en-gb');
const input = '01/02/2000'; // 期望:1st Feb 2000 → DD/MM/YYYY
// ✅ 显式声明输入格式为 'DD/MM/YYYY'
const parsed = dayjs(input, 'DD/MM/YYYY');
console.log(parsed.format('DD/MM/YYYY')); // "01/02/2000"
console.log(parsed.format('MMMM Do, YYYY')); // "February 1st, 2000"(en-gb 本地化生效)⚠️ 注意事项:
- dayjs.locale('en-gb') 后调用 dayjs('01/02/2000') 仍会按 MM/DD/YYYY 解析——locale 不控制解析逻辑;
- 若需全局统一解析规则,建议封装工具函数,避免重复传入格式字符串:
const parseGBDate = (str) => dayjs(str, 'DD/MM/YYYY'); console.log(parseGBDate('29/02/2024').isValid()); // true - 对于用户输入、表单数据等不确定格式的场景,绝不依赖隐式解析;始终使用带格式字符串的构造方式,或结合 dayjs/plugin/customParseFormat 插件增强鲁棒性(需提前启用);
- 日期字符串优先推荐使用 ISO 8601 标准格式(如 '2000-02-01'),该格式无地域歧义且无需额外格式声明。
总结:Day.js 的 locale 是“输出导向”的,而解析是“格式导向”的。要实现 GB 日期语义,必须主动声明输入格式 —— 这不是 bug,而是设计上对明确性与可预测性的坚持。










