验证JavaScript中是否存在日期(假设格式正确)

Validate existence of a date in JavaScript (assuming proper formatting)

本文关键字:格式 假设 日期 JavaScript 是否 存在 验证      更新时间:2023-09-26

我正在构建一个JavaScript和HTML小部件,它将驻留在外部网页上(通过复制/粘贴片段)并反馈到rails应用程序中。我注意到JavaScript函数Date.parse("09/31/2014")返回一个数字,就好像它是一个真实的日期(今年9月只有30天),但当这样的日期到达后端时,rails会拒绝它(这可以通过在IRB中运行"09/31/2014".to_date来证明)。

我正在寻找一种不依赖外部库的解决方案,因为作为一个嵌入式小部件,我不想将大量的外部资源加载到宿主页面中。

当您使用示例中的输入运行Date.parse时,javascript会注意到您在9月份的天数太多,并溢出到10月份。返回的数字是2014年10月1日的时间戳。如果将数字传递给Date构造函数以创建一个新的Date对象,则可以看出这一点。

var date = new Date(Date.parse("09/31/2014"));
console.log(date.toLocaleDateString()); // "10/1/2014"

如果溢出是可以接受的,那么像这样重新解析时间戳将允许您编写一个函数,将字符串中的日期更正为有效日期。如果这种溢出是不可接受的,并且您只需要验证用户输入,并让他们更正它,那么您就可以很容易地根据重新解析的日期对象的值检查用户字符串的每个组件。

function validateDateString(inputString) {
    var day, month, year,
        valid = false,
        dateRegex = /(['d]{1,2})'/(['d]{1,2})'/((?:['d]{2}){1,2})/,
        searched = dateRegex.exec(inputString),
        dateObj = new Date(Date.parse(inputString));
    if (searched) {
        // If we're here, the date regex found a match
        // Assume date is valid until checks prove otherwise
        valid = true;
        month = parseInt(searched[1], 10);
        day = parseInt(searched[2], 10);
        year = parseInt(searched[3], 10);
        // Date object months are zero indexed
        if (month !== (dateObj.getMonth() + 1)) {
            valid = false;
        } else if (day !== dateObj.getDate()) {
            valid = false;
        } else if (year !== dateObj.getFullYear()) {
            valid = false;
        }
    }
    return valid;
}

对于您提供的无效日期输入,上述函数将返回false(我假设日期字符串的格式始终一致),但对于相同格式的有效日期字符串,函数将返回true。