dayjs不使用CustomParseFormat能否解析自定义格式日期
问题解答
两个问题直接给明确结论:
- 不加载CustomParseFormat插件时,dayjs完全不支持按自定义格式解析日期。
你测试时传了格式串、开了严格模式还能拿到有效结果,本质是你传入的第一个参数是new Date()生成的合法原生Date对象——dayjs原生解析逻辑只要识别到第一个输入是它内置支持的类型(合法Date实例、时间戳、标准ISO8601字符串),后面传的格式串、严格模式标记会被直接忽略,根本不会按你给的格式做匹配校验。你要是换个非标准的自定义格式字符串当输入,哪怕格式串写的完全对,不加载插件要么返回无效日期,要么解析出来的日期值完全错乱,这也是官方文档明确要求自定义格式解析必须引入CustomParseFormat插件的原因。
- 不加载CustomParseFormat插件时,dayjs完全不支持按自定义格式解析日期。
- 无插件的解析方式完全没法保证和moment.js严格模式的解析结果一致。
无插件状态下所谓的“严格模式”根本不生效,解析逻辑全靠JS原生Date的自动容错规则,和moment严格模式的校验逻辑差得很远:比如明显不符合格式的非法时间(像月份传13、小时传25这种值),原生Date会自动做进位换算返回一个有效日期,moment开严格模式会直接返回无效日期;非标准格式的字符串解析还可能出现时区偏移、日月错位的问题,行为根本对不齐。
- 无插件的解析方式完全没法保证和moment.js严格模式的解析结果一致。
对应bug的规避方法
你碰到的加载CustomParseFormat插件后传入Date对象返回无效日期的问题,不用等插件修复,逻辑上绕开就好:自定义格式解析本身是面向字符串输入的能力,解析原生Date对象的时候根本不需要走格式匹配流程,遇到Date类型输入直接调用原生dayjs解析就行,只有解析字符串的时候再带格式串和严格模式参数,参考代码:
const dayjs = require('dayjs'); const customParseFormat = require('dayjs/plugin/customParseFormat') dayjs.extend(customParseFormat); const iso8601Format = 'YYYY-MM-DDTHH:mm:ss.sssZ' const currentDate = new Date(); // Date类型输入直接走原生解析,不需要传格式和严格模式参数 console.log(dayjs(currentDate)); // 字符串输入再走自定义格式严格校验解析 const isoTimeStr = currentDate.toISOString(); console.log(dayjs(isoTimeStr, iso8601Format, true));
内容的提问来源于stack exchange,提问作者shoi
相关产品推荐
相关产品推荐

