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

JavaScript中DD-MM-YYYY格式的字符串日期如何正确比较?

问题解决思路

你提前对moment日期对象调用了format()方法转成了DD-MM-YYYY格式的字符串,原生Date构造器无法可靠解析这种格式的字符串,不同浏览器会出现解析规则混乱、返回非法日期的问题,所以转换失败导致比较失效。

下面是3种可直接使用的解决方案,按推荐优先级排序:

  • 方法1:直接使用moment内置的日期比较方法(最推荐,无额外转换开销)
    完全不需要提前调用format()转字符串,直接用原始moment对象比较即可,moment内置了isBefore()/isAfter()/isSame()等多种比较方法:
    // 取消提前format,保留moment对象用于比较
    const dateToCompare = moment.utc(endDate);
    const maximum = moment.utc(addDays(new Date(),14));
    
    // 示例:判断dateToCompare是否早于maximum
    const isBeforeMax = dateToCompare.isBefore(maximum);
    // 示例:判断dateToCompare是否晚于maximum
    const isAfterMax = dateToCompare.isAfter(maximum);
    // 示例:判断两个日期是否精确到天相等
    const isSame = dateToCompare.isSame(maximum, 'day');
    
  • 方法2:已经拿到格式化后的DD-MM-YYYY字符串的场景,用moment指定格式解析后比较
    // 按字符串的实际格式传入第二个参数,避免解析错误
    const parsedCompareDate = moment(dateToCompare, 'DD-MM-YYYY');
    const parsedMaxDate = moment(maximum, 'DD-MM-YYYY');
    const isBeforeMax = parsedCompareDate.isBefore(parsedMaxDate);
    
  • 方法3:不依赖moment的原生JS实现方案
    把DD-MM-YYYY字符串拆分后转为YYYYMMDD格式的数字,直接比较数字大小即可,不会出现解析歧义:
    function convertDateStrToNum(dateStr) {
      const [dd, mm, yyyy] = dateStr.split('-').map(Number);
      return yyyy * 10000 + mm * 100 + dd;
    }
    // 数字直接比较大小即可,小于代表更早,大于代表更晚,相等代表是同一天
    const isBeforeMax = convertDateStrToNum(dateToCompare) < convertDateStrToNum(maximum);
    

内容的提问来源于stack exchange,提问作者iulia_g31

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:18:01