如何在 JavaScript 中验证格式为“mm/dd/yyyy”的日期?

IT技术 javascript validation date
2021-02-06 22:18:38

我想使用 format验证输入上日期格式mm/dd/yyyy

我在一个站点中找到以下代码,然后使用它但它不起作用:

function isDate(ExpiryDate) { 
    var objDate,  // date object initialized from the ExpiryDate string 
        mSeconds, // ExpiryDate in milliseconds 
        day,      // day 
        month,    // month 
        year;     // year 
    // date length should be 10 characters (no more no less) 
    if (ExpiryDate.length !== 10) { 
        return false; 
    } 
    // third and sixth character should be '/' 
    if (ExpiryDate.substring(2, 3) !== '/' || ExpiryDate.substring(5, 6) !== '/') { 
        return false; 
    } 
    // extract month, day and year from the ExpiryDate (expected format is mm/dd/yyyy) 
    // subtraction will cast variables to integer implicitly (needed 
    // for !== comparing) 
    month = ExpiryDate.substring(0, 2) - 1; // because months in JS start from 0 
    day = ExpiryDate.substring(3, 5) - 0; 
    year = ExpiryDate.substring(6, 10) - 0; 
    // test year range 
    if (year < 1000 || year > 3000) { 
        return false; 
    } 
    // convert ExpiryDate to milliseconds 
    mSeconds = (new Date(year, month, day)).getTime(); 
    // initialize Date() object from calculated milliseconds 
    objDate = new Date(); 
    objDate.setTime(mSeconds); 
    // compare input date and parts from Date() object 
    // if difference exists then date isn't valid 
    if (objDate.getFullYear() !== year || 
        objDate.getMonth() !== month || 
        objDate.getDate() !== day) { 
        return false; 
    } 
    // otherwise return true 
    return true; 
}

function checkDate(){ 
    // define date string to test 
    var ExpiryDate = document.getElementById(' ExpiryDate').value; 
    // check date and print message 
    if (isDate(ExpiryDate)) { 
        alert('OK'); 
    } 
    else { 
        alert('Invalid date format!'); 
    } 
}

关于可能出什么问题的任何建议?

6个回答

我认为 Niklas 对您的问题有正确的答案。除此之外,我认为以下日期验证函数更容易阅读:

// Validates that the input string is a valid date formatted as "mm/dd/yyyy"
function isValidDate(dateString)
{
    // First check for the pattern
    if(!/^\d{1,2}\/\d{1,2}\/\d{4}$/.test(dateString))
        return false;

    // Parse the date parts to integers
    var parts = dateString.split("/");
    var day = parseInt(parts[1], 10);
    var month = parseInt(parts[0], 10);
    var year = parseInt(parts[2], 10);

    // Check the ranges of month and year
    if(year < 1000 || year > 3000 || month == 0 || month > 12)
        return false;

    var monthLength = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];

    // Adjust for leap years
    if(year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
        monthLength[1] = 29;

    // Check the range of the day
    return day > 0 && day <= monthLength[month - 1];
};
@MitchLabrador - 感谢您的反馈。我根据您的建议改进了正则表达式。
2021-03-11 22:18:38
请记住使用 parseInt: 的第二个参数parseInt(parts[0], 10)否则,九月的09被读为八进制并解析为 0
2021-03-19 22:18:38
几年后,这为我节省了相当多的时间,感谢您的甜蜜回答!
2021-03-22 22:18:38
优秀的帖子!将正则表达式格式与验证所需的解析相结合。
2021-03-23 22:18:38
我建议您将正则表达式更改为:/^(\d{2}|\d{1})\/(\d{2}|\d{1})\/\d{4}$/ this它捕获一位数的月份和日期 1/5/2014 的方式。感谢您的样品!
2021-03-25 22:18:38

我会使用Moment.js进行日期验证。

alert(moment("05/22/2012", 'MM/DD/YYYY',true).isValid()); //true

jsfiddle:http : //jsfiddle.net/q8y9nbu5/

true值用于严格解析@Andrey Prokhorov,这意味着

您可以为最后一个参数指定一个布尔值,以使 Moment 使用严格解析。严格解析要求格式和输入完全匹配,包括分隔符。

很高兴知道第三个参数“true”保留为“使用严格解析” momentjs.com/docs/#/parsing/string-format
2021-03-20 22:18:38
@Razan Paul 希望你不介意我添加了一些解释以便更清楚。明智的做法是不要一次又一次地重新发明轮子,所以在我看来,pual 的答案是最好的
2021-04-01 22:18:38
使用 "M/D/YYYY" 允许 1-2 位数字表示月和日。
2021-04-02 22:18:38
时刻(dateString, 'MM/DD/YYYY', true).isValid() || 时刻(dateString, 'M/DD/YYYY', true).isValid() || 时刻(dateString, 'MM/D/YYYY', true).isValid();
2021-04-04 22:18:38

使用以下正则表达式进行验证:

var date_regex = /^(0[1-9]|1[0-2])\/(0[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}$/;
if (!(date_regex.test(testDate))) {
    return false;
}

这对我来说适用于 MM/dd/yyyy。

我们将如何验证yyyy-mm-dd或无效日期,如9834-66-43
2021-03-18 22:18:38
3000年会发生什么?:)
2021-03-28 22:18:38
这太棒了,因为我一个讨厌制定正则表达式,两个喜欢他们的效率!
2021-03-29 22:18:38
您可以使用 /^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3 [0-1])$/ 验证 yyyy-mm-dd。
2021-04-01 22:18:38
@TheOne..y3k 问题.. :P
2021-04-06 22:18:38

所有学分归elian-ebbing所有

对于这里的懒人,我还提供了一个自定义版本的函数,格式为yyyy-mm-dd

function isValidDate(dateString)
{
    // First check for the pattern
    var regex_date = /^\d{4}\-\d{1,2}\-\d{1,2}$/;

    if(!regex_date.test(dateString))
    {
        return false;
    }

    // Parse the date parts to integers
    var parts   = dateString.split("-");
    var day     = parseInt(parts[2], 10);
    var month   = parseInt(parts[1], 10);
    var year    = parseInt(parts[0], 10);

    // Check the ranges of month and year
    if(year < 1000 || year > 3000 || month == 0 || month > 12)
    {
        return false;
    }

    var monthLength = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];

    // Adjust for leap years
    if(year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
    {
        monthLength[1] = 29;
    }

    // Check the range of the day
    return day > 0 && day <= monthLength[month - 1];
}
同样为了测试 yyyy-mm-dd 格式的日期模式,这个正则表达式/^\d{4}\-\d{1,2}\-\d{1,2}$/将验证 yyyy-mm-dd 或 yyyy-md 为真,因此它只验证长度而不是每个单独的日期部分。对于 yyyy-mm-dd 的精确长度,无需检查年、月和日是否正确,请/^\d{4}\-\d{2}\-\d{2}$/改用。
2021-04-02 22:18:38
这将验证“2020-5-1”为真,而忽略前导零。在解析之前/^(19|20)\d\d$/我首先测试了年份、月份/^(0[0-9]|1[0-2])$/和日期的模式,使其工作/^(0[1-9]|[12][0-9]|3[01])$/然后它工作了谢谢。
2021-04-08 22:18:38

你可以用 Date.parse()

您可以在MDN 文档中阅读

Date.parse() 方法解析日期的字符串表示,并返回自 1970 年 1 月 1 日 00:00:00 UTC 或 NaN 以来的毫秒数(如果字符串无法识别,或者在某些情况下包含非法日期值) (例如 2015-02-31)。

并检查Date.parseisNaN的结果是否

let isValidDate = Date.parse('01/29/1980');

if (isNaN(isValidDate)) {
  // when is not valid date logic

  return false;
}

// when is valid date logic

请看一下什么时候推荐Date.parse在MDN中使用

Date.parse 会给你一个有效的解析,日期如“46/7/17”
2021-03-19 22:18:38
将返回 yyyy/02/30 的真实结果
2021-03-22 22:18:38
投反对票,因为这将允许垃圾通过。例如Date.parse('01//////29//000')
2021-04-02 22:18:38