
dayjs 在旧版本(如 1.1.17)中存在严格模式(`strict: true`)下无法正确解析含时区 iso 格式日期字符串的 bug,升级至 1.1.19+ 即可修复。
在从 Moment.js 迁移至 Day.js 的过程中,开发者常依赖 dayjs(date, formats, strict) 的严格多格式解析能力来校验时间戳合法性。但若使用较老版本(例如 v1.11.17),即使输入完全符合 ISO 8601 时区规范的字符串(如 "2023-03-01T15:41:00+01:00"),以下代码也会始终返回 false:
function isValidTimestampDateTime(date) {
const datetimeFormats = [
"YYYY-MM-DDTHH:mm:ssZ", // e.g., 2023-03-01T15:41:00+01:00
"YYYY-MM-DDTHH:mm:ss.SSSZ", // e.g., 2023-03-22T11:51:53.766+01:00
"YYYY-MM-DDTHH:mm:ss[Z]", // e.g., 2023-03-22T11:51:53Z
];
return dayjs(date, datetimeFormats, true).isValid(); // ❌ v1.11.17 中恒为 false
}该行为与 Moment.js 的 moment(date, formats, true).isValid() 表现不一致,容易引发校验逻辑失效。
✅ 根本原因:Day.js 在 v1.11.19 版本前对 Z(时区偏移)和 [Z](字面量 Z)在严格多格式解析中的匹配逻辑存在缺陷,导致解析器无法准确识别并匹配含时区的 ISO 字符串。
✅ 解决方案:
- 升级 Day.js 至 ≥1.11.19(推荐使用最新稳定版,如 1.11.10+ 或 1.12.x);
- 升级后无需修改代码,上述 isValidTimestampDateTime 函数即可按预期工作。
? 验证示例(v1.11.19+):
console.log(isValidTimestampDateTime("2023-03-01T15:41:00+01:00")); // true
console.log(isValidTimestampDateTime("2023-03-22T11:51:53.766Z")); // true
console.log(isValidTimestampDateTime("2023-03-22T11:51:53.766+01:00")); // true⚠️ 注意事项:
- 严格模式(true 第三个参数)要求输入完全匹配任一格式,不允许多余字符或隐式推断(如 2023-03-01T15:41:00 缺少时区将失败);
- 若需兼容更宽松场景(如接受无时区输入),建议显式处理默认时区(如 .utc() 或 .local()),或补充不含 Z 的格式;
- 始终通过 npm list dayjs 或 yarn list dayjs 确认实际安装版本,避免因锁版本(package-lock.json)导致未真正升级。
升级后,Day.js 的严格解析能力将与 Moment.js 对齐,保障时间校验逻辑的健壮性与可迁移性。










