有什么简单的方法来检查一个值是否为有效日期,允许任何已知的日期格式。

例如,我有值10-11-2009、10/11/2009、2009-11-10T07:00:00+0000,这些值都应该被识别为日期值,而值200、10、350不应该被识别为日期值。如果可能的话,最简单的检查方法是什么?因为时间戳也是允许的。


当前回答

下面是一个只使用Date.parse()的改进函数:

function isDate(s) {
    if(isNaN(s) && !isNaN(Date.parse(s)))
        return true;
    else return false;
}

注意:date. parse()将解析数字:例如date. parse(1)将返回日期。这里我们检查s是不是数字,是不是日期。

其他回答

这个可调用函数工作得很好,有效日期返回true。 请确保使用ISO格式的日期(yyyy-mm-dd或yyyy/mm/dd)调用:

function validateDate(isoDate) {

    if (isNaN(Date.parse(isoDate))) {
        return false;
    } else {
        if (isoDate != (new Date(isoDate)).toISOString().substr(0,10)) {
            return false;
        }
    }
    return true;
}

我就是这么做的。这不会涵盖所有格式。 你必须相应地调整。我可以控制格式,所以它适合我

function isValidDate(s) {
            var dt = "";
            var bits = [];
            if (s && s.length >= 6) {
                if (s.indexOf("/") > -1) {
                    bits = s.split("/");
                }
                else if (s.indexOf("-") > -1) {
                    bits = s.split("-");
                }
                else if (s.indexOf(".") > -1) {
                    bits = s.split(".");
                }
                try {
                    dt = new Date(bits[2], bits[0] - 1, bits[1]);
                } catch (e) {
                    return false;
                }
                return (dt.getMonth() + 1) === parseInt(bits[0]);
            } else {
                return false;
            }
        }

下面是可以用来验证输入是否为可以转换为日期对象的数字或字符串的方法。

它涵盖以下情况:

捕获任何导致“无效日期”日期构造函数结果的输入; 捕捉从技术角度来看日期是“有效的”,但从业务逻辑角度来看它是无效的情况,例如

new Date(null).getTime(): 0 new Date(true).getTime(): 1 new Date(-3.14).getTime(): -3 new Date(["1", "2"]).toDateString(): Tue Jan 02 2001 new Date([1,2]).toDateString(): Tue Jan 02 2001

function checkDateInputValidity(input, lowerLimit, upperLimit) {
    // make sure the input is a number or string to avoid false positive correct dates:
    if (...) {
        return false
    }
    // create the date object:
    const date = new Date(input)
    // check if the Date constructor failed:
    if (date.toDateString() === 'Invalid Date') {
        return false
    }
    // check if the Date constructor succeeded, but the result is out of range:
    if (date < new Date(lowerLimit) || date > new Date(upperLimit)) {
        return false
    }
    return true
}

// const low = '2021-12-31T23:59:59'
// const high = '2025-01-01T00:00:00'

我觉得没有一个答案正确理解了OP的问题。这里的问题是JavaScript可以将任何数字解析为有效日期,因为date对象可以将'3000'这样的字符串解析为年份,并将返回一个有效的date实例:

new Date('3000')

> Wed Jan 01 3000 02:00:00 GMT+0200 (Eastern European Standard Time)

为了解决这个问题,我们可以在严格模式下通过传入第三个参数来使用Day.js库的解析方法。它被记录在他们的字符串+格式页面。为了使解析能够基于格式工作,我们还必须启用CustomParseFormat插件。我假设你可以在这里使用ESM导入,或者设置一个像Webpack这样的编译器

import dayjs from 'dayjs'
import formatParser from 'dayjs/plugin/customParseFormat'

dayjs.extend(formatParser)

dayjs('3000', 'YYYY-MM-DD', true).isValid()

> false

这是一个极简的版本。

var isDate = function (date) {
    return!!(function(d){return(d!=='Invalid Date'&&!isNaN(d))})(new Date(date));
}