You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的行为:

  1. 引入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);
    
  2. 开启严格模式解析日期
    在调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 18:37:28