这是在JavaScript中检查有效日期的好方法吗?

这是在JavaScript中检查有效日期的好方法吗?,javascript,validation,Javascript,Validation,请纠正或解释我的过度简化是如何不正确的,因为我不是JavaScript专家 但我只需要知道一个对象是否是有效日期。这将仅来自用户输入(即,文本框) new Date()如果月份>12,则不会引发异常。例如,您可以使用Date.parse()并使用isNaN()测试返回值。您必须决定要接受哪种形式的日期 然后,一旦知道要接受的表单,就可以检查newdate(str)或Date.parse()。如果没有,那么您将不得不进行一些手动解析 如果您需要我们的进一步帮助,您需要指定您希望接受的日期形式 还有

请纠正或解释我的过度简化是如何不正确的,因为我不是JavaScript专家

但我只需要知道一个对象是否是有效日期。这将仅来自用户输入(即,文本框)


new Date()
如果月份>12,则不会引发异常。例如,您可以使用
Date.parse()
并使用
isNaN()测试返回值。
您必须决定要接受哪种形式的日期

然后,一旦知道要接受的表单,就可以检查
newdate(str)
Date.parse()。如果没有,那么您将不得不进行一些手动解析

如果您需要我们的进一步帮助,您需要指定您希望接受的日期形式

还有一些浏览器的不同之处,因为javascript已经开始支持其他日期格式,而早期的浏览器之间存在一些不一致之处,这都意味着您需要使用一组合法和非法的日期格式字符串构建一个简单的测试脚本,并查看您的有效性检测在几个方面是否达到了您的要求浏览器。这不是正确的火箭科学,但也不是微不足道的,需要做一些工作,除非您只想接受原始日期对象支持的内容(这是不可能的)

如果这是我的代码,我可能会认为手动解析所需的输入格式所需的工作量要小得多,因为这是您自己的手动解析,所以您100%确定可以在所有浏览器中工作。我可能会使用正则表达式来解析日期,然后将每个组件转换为一个数字,并检查每个组件的有效性。然后,您可以将这些数字组件提供给日期构造函数以创建日期对象

如果您现在知道,内置的date类对于用户输入的输入不是很有用。如果您愿意为此使用库,则在这方面有大量有用的功能

下面是一个接受这些US格式的手动解析函数示例:

mm-dd-yyyy
mm dd yyyy
mm/dd/yyyy
JS代码:

function checkDate(str) {
    var matches = str.match(/(\d{1,2})[- \/](\d{1,2})[- \/](\d{4})/);
    if (!matches) return;

    // parse each piece and see if it makes a valid date object
    var month = parseInt(matches[1], 10);
    var day = parseInt(matches[2], 10);
    var year = parseInt(matches[3], 10);
    var date = new Date(year, month - 1, day);
    if (!date || !date.getTime()) return;

    // make sure we have no funny rollovers that the date object sometimes accepts
    // month > 12, day > what's allowed for the month
    if (date.getMonth() + 1 != month ||
        date.getFullYear() != year ||
        date.getDate() != day) {
            return;
        }
    return(date);
}
以及一些测试用例的演示:

如果您想要欧元格式,将代码切换到欧元格式是一件小事。在任何一种情况下,您都必须决定接受哪种格式,为其编码,然后向用户传达所需的格式。如果你认为这很混乱,那么也许你会明白为什么这么多网站使用的日期日历选择器没有这么复杂

请纠正或解释我的过度简化是如何不正确的,因为我不是JavaScript专家

但我只需要知道一个对象是否是有效日期。这将仅来自用户输入(即,文本框)

这就是为什么它过于简单化了

首先,听起来您确实想要检查日期对象的字符串表示的有效性。这本身并不是特别有用,因为您需要在脚本中使用日期,将其发送到服务器,等等

如果您想在脚本中使用日期,则有

如果您想将其传递给服务器,您需要做的不仅仅是检查有效性,还需要使用服务器端代码可以解释的格式

如果是这样的话,你可以考虑将字符串归一化为你所选择的格式。您希望能够从客户端和服务器端代码中的规范化字符串创建等效日期。为简单起见,格式可以是人类可读的(而不是时间戳),并且可以用规范化字符串替换文本输入的值

检查字符串的有效性只是规范化的一部分。。。如果输入错误,让函数返回
false
或空字符串,不要更改文本输入的值,而是显示一条消息,指示该值无效:

// assume `birthday` is a text input.

birthday.onblur = function() {
    
    var dateString = normalizeDate(birthday.value);
    
    if (dateString) {
        validator.style.display = 'none';
        birthday.value = dateString;
    } else {
        validator.style.display = 'block';
    }
        
}; 
下面是
normalizeDate
函数的示例。此示例使用“yyyy-mm-dd”格式,您可以根据需要对其进行更改

function normalizeDate(dateString) {

    // If it's not at least 6 characters long (8/8/88), give up.
    if (dateString.length && dateString.length < 6) {
        return '';
    }

    var date = new Date(dateString), 
        month, day;

    // If input format was in UTC time, adjust it to local.
    if (date.getHours() || date.getMinutes()) {
        date.setMinutes(date.getTimezoneOffset());
    }
    
    month = date.getMonth() + 1;
    day = date.getDate();
    
    // Return empty string for invalid dates
    if (!day) {
        return '';
    }
    
    // Return the normalized string.
    return date.getFullYear() + '-' +
        (month > 9 ? '' : '0') + month + '-' + 
        (day > 9 ? '' : '0') + day;
}
函数normalizeDate(日期字符串){
//如果长度不超过6个字符(8/8/88),请放弃。
if(dateString.length&&dateString.length<6){
返回“”;
}
变量日期=新日期(日期字符串),
月,日;
//如果输入格式为UTC时间,请将其调整为本地格式。
if(date.getHours()| date.getMinutes()){
date.setMinutes(date.getTimezoneOffset());
}
月=日期。getMonth()+1;
day=date.getDate();
//返回无效日期的空字符串
如果(!天){
返回“”;
}
//返回规范化字符串。
返回日期。getFullYear()+'-'+
(月份>9?'':'0')+月份+'-'+
(天>9?'':'0')+天;
}

这是必须的。

+新日期('1980-13-10')
给了我Chrome中的
NaN
,与
Date.parse相同。有什么区别吗?
Date.parse
将为带有单个整数值的字符串返回非NaN响应,例如,
Date.parse(“2”)
=>
981003600000
。独立数字被读取为不带日期和年份的月份值。(浏览器在省略日期和年份时使用默认值
1
。@apsillers
+new Date('2')
在我的浏览器中给出了相同的结果,
981003600000
。我认为
Date.parse
+new Date
几乎相同(除了
+new Date()的零参数)
结果为当前时间,
Date.parse()
NaN
,但这是唯一的区别)。@apsillers所以这个答案并不能解决问题,它只是把它左右移动了一点。我想还有更多<代码>日期(字符串)
除非您确切知道自己在做什么,否则绝对不能使用。即使他渴望
// assume `birthday` is a text input.

birthday.onblur = function() {
    
    var dateString = normalizeDate(birthday.value);
    
    if (dateString) {
        validator.style.display = 'none';
        birthday.value = dateString;
    } else {
        validator.style.display = 'block';
    }
        
}; 
function normalizeDate(dateString) {

    // If it's not at least 6 characters long (8/8/88), give up.
    if (dateString.length && dateString.length < 6) {
        return '';
    }

    var date = new Date(dateString), 
        month, day;

    // If input format was in UTC time, adjust it to local.
    if (date.getHours() || date.getMinutes()) {
        date.setMinutes(date.getTimezoneOffset());
    }
    
    month = date.getMonth() + 1;
    day = date.getDate();
    
    // Return empty string for invalid dates
    if (!day) {
        return '';
    }
    
    // Return the normalized string.
    return date.getFullYear() + '-' +
        (month > 9 ? '' : '0') + month + '-' + 
        (day > 9 ? '' : '0') + day;
}