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

jQuery中dd/MM/yyyy格式日期比较逻辑异常及Invalid Date问题求助

jQuery中dd/MM/yyyy格式日期比较逻辑异常及Invalid Date问题求助

问题背景

我在做jQuery前端开发时,碰到了两个和日期相关的头疼问题:一是按dd/MM/yyyy格式比较日期时逻辑完全混乱——明明journal日期比当前日期小,却还是触发了错误提示;二是尝试用原生Date对象转换dd/MM/yyyy格式的日期字符串时,直接出现了"Invalid Date"的错误。

先把第一个问题的场景说清楚:我要实现的逻辑其实很简单:

  • 当用户选择的journal日期(dd/MM/yyyy格式)大于当前日期时,弹出错误提示;
  • 当journal日期小于当前日期时,正常执行后续流程。

但实际运行时完全不对,比如:

  • 当前日期格式化后是09/01/2025(按dd/MM/yyyy就是2025年1月9日);
  • 用户选的journal日期是31/12/2024(2024年12月31日)。

这个journal日期明明比当前日期小,可代码还是触发了错误提示,直接走进了if判断块里。

我最开始写的代码是直接比较格式化后的日期字符串,结果踩了大坑:

function formatCurrentDate() {
    let currentDate = new Date();
    let month = String(currentDate.getMonth() + 1).padStart(2, '0'); // 月份是0开始的,要加1
    let day = String(currentDate.getDate()).padStart(2, '0');
    let year = currentDate.getFullYear();
    return `${day}/${month}/${year}`;
}

let currentDateFormatted = formatCurrentDate(); // 比如返回 09/01/2025 (dd/MM/yyyy)
let pJournalDate = $("#txt_journal_date").val(); // 比如是 31/12/2024 (dd/MM/yyyy)

if (pJournalDate > currentDateFormatted) {
    ModelSuccessDanger(
        MYLang.ReturnLang() === "ar-KW" ? 'عفوا !!' : 'Warning !!',
        MYLang.ReturnLang() === "ar-KW" ? "يجب ان لا يكون تاريخ الغلق اكبر من تاريخ اليوم" : "You should specify a date for closing that is not greater than the current date",
        '0',
        null
    );
    return false;
}

后来我想改用Date对象来比较,结果又遇到新问题:比如用户输入的日期是23/01/2025,执行new Date(inputDate)直接返回"Invalid Date",根本没法用。我需要一个通用的解决方案,不管是什么dd/MM/yyyy格式的日期,都能和当前日期正确比较,还不会出转换错误。

问题原因分析

1. 直接比较日期字符串的坑

直接对比dd/MM/yyyy格式的字符串,本质是按字符的ASCII码顺序逐位比,不是按实际日期大小比。比如31/12/2024和09/01/2025:第一个字符3的ASCII码比0大,所以字符串比较会认为31/12/2024 > 09/01/2025,但实际这个日期是更小的,直接导致逻辑完全反转。

2. 原生Date对象不支持解析dd/MM/yyyy

原生Date对象默认只认MM/dd/yyyy或者ISO格式yyyy-MM-dd的字符串,直接传入dd/MM/yyyy格式的内容,它识别不了,自然就返回无效日期了。

解决方法

这里给两种通用的解决方案,都能同时解决这两个问题:

方法1:手动解析日期字符串,构建Date对象后再比较

写一个工具函数,把dd/MM/yyyy格式的字符串拆分成日、月、年,再传入Date构造函数(注意:Date的月份是0-based,所以要减1),然后直接比较两个Date对象的大小:

// 把dd/MM/yyyy格式的字符串转成Date对象
function parseDDMMYYYY(dateStr) {
    const [day, month, year] = dateStr.split('/');
    // 月份减1,因为Date的月份是0-11
    return new Date(year, month - 1, day);
}

// 处理日期验证的主函数
function validateJournalDate() {
    // 获取当前日期,把时分秒设为0,避免时间部分影响日期比较
    const currentDate = new Date();
    currentDate.setHours(0, 0, 0, 0);

    // 获取用户输入的日期字符串
    const journalDateStr = $("#txt_journal_date").val();
    // 转成Date对象
    const journalDate = parseDDMMYYYY(journalDateStr);

    // 先判断日期是否有效
    if (isNaN(journalDate.getTime())) {
        alert("请输入有效的日期(格式为dd/MM/yyyy)");
        return false;
    }

    // 比较两个Date对象的大小
    if (journalDate > currentDate) {
        ModelSuccessDanger(
            MYLang.ReturnLang() === "ar-KW" ? 'عفوا !!' : 'Warning !!',
            MYLang.ReturnLang() === "ar-KW" ? "يجب ان لا يكون تاريخ الغلق اكبر من تاريخ اليوم" : "You should specify a date for closing that is not greater than the current date",
            '0',
            null
        );
        return false;
    }

    // 日期符合要求,继续执行后续逻辑
    return true;
}

方法2:转成ISO格式字符串再比较

如果不想用Date对象,也可以把dd/MM/yyyy转成yyyy-MM-dd的ISO格式字符串,这种格式的字符串可以直接按字符顺序比较,结果和实际日期大小一致:

// 把dd/MM/yyyy转成yyyy-MM-dd格式
function convertToISOFormat(dateStr) {
    const [day, month, year] = dateStr.split('/');
    return `${year}-${month}-${day}`;
}

// 处理日期验证的主函数
function validateJournalDate() {
    // 获取当前日期的ISO格式字符串(只取日期部分)
    const currentISO = new Date().toISOString().split('T')[0];

    // 获取用户输入的日期并转成ISO格式
    const journalDateStr = $("#txt_journal_date").val();
    const journalISO = convertToISOFormat(journalDateStr);

    // 比较ISO格式的字符串
    if (journalISO > currentISO) {
        ModelSuccessDanger(
            MYLang.ReturnLang() === "ar-KW" ? 'عفوا !!' : 'Warning !!',
            MYLang.ReturnLang() === "ar-KW" ? "يجب ان لا يكون تاريخ الغلق اكبر من تاريخ اليوم" : "You should specify a date for closing that is not greater than the current date",
            '0',
            null
        );
        return false;
    }

    // 日期符合要求,继续执行后续逻辑
    return true;
}

验证效果

用之前的异常场景测试:

  • 当前日期是2025年1月9日,ISO格式是2025-01-09;
  • journal日期是2024年12月31日,ISO格式是2024-12-31;
  • 比较2024-12-31 > 2025-01-09结果为false,不会触发错误,完全符合预期。

如果journal日期是10/01/2025(2025年1月10日),转成ISO格式是2025-01-10,比当前日期大,就会触发错误,完美匹配需求。


备注:内容来源于stack exchange,提问作者ahmed salah abd elaziz elbarba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:59:30