DayJS format()方法错误转换历史日期的问题排查与解决咨询
DayJS format() 错误转换历史日期(公元2年变1902年)的原因与解决方案
我之前也碰到过类似的问题,这其实不是你使用方法有误,而是DayJS默认的日期解析逻辑导致的小坑~
问题根源
DayJS默认的日期解析依赖于浏览器的原生Date对象,而很多浏览器在处理像'0002-05-01'这种前两位为00的4位年份时,会自动将其映射到1900-1999这个区间(这是一种历史遗留的解析规则,早期为了处理两位年份的输入)。所以即使你传入的是4位的0002,原生Date还是会把它解析成1902年,最终导致format输出错误的结果。
解决方案
要正确解析这类公元早期的日期,你需要用到DayJS的CustomParseFormat插件,并开启严格解析模式,让DayJS严格按照你指定的格式来解析每一部分,而不依赖原生Date的行为:
引入CustomParseFormat插件
如果你是在浏览器环境中使用,需要额外引入这个插件(DayJS默认不包含):<script src="https://cdn.jsdelivr.net/npm/dayjs@1/dayjs.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/dayjs@1/plugin/customParseFormat.js"></script>如果是Node.js环境,用npm安装后导入:
const dayjs = require('dayjs'); const customParseFormat = require('dayjs/plugin/customParseFormat'); dayjs.extend(customParseFormat);开启严格模式解析日期
在调用dayjs()的时候,传入第三个参数true开启严格解析,确保DayJS完全按照YYYY-MM-DD的格式解析年份:// 扩展插件后使用 const formattedDate = dayjs('0002-05-01', 'YYYY-MM-DD', true).format('YYYY-MM-DD'); console.log(formattedDate); // 正确输出 "0002-05-01"
为什么这样有效?
CustomParseFormat插件让DayJS可以自定义解析规则,而严格模式会强制DayJS严格匹配你指定的格式,不会 fallback 到原生Date的解析逻辑。YYYY占位符会精确识别4位数字的年份,包括前导零的公元早期年份,从而避免了年份被错误映射到1900区间的问题。
内容的提问来源于stack exchange,提问作者Hexodus
相关产品推荐
相关产品推荐

