我如何在javascript中禁止宽大的日期?
我试图验证字符串是否为有效日期。parsedateString或new DateString都非常宽松。例如,像2000年14月14日这样的日期显示为2001年2月14日。我尝试了一个正则表达式,但现在我需要验证多个mm/dd/yyyy,我还需要验证yyyy-mm ddThh:mm:ss,例如1951-02-05T00:00:00 我现在正在使用正则表达式和一些基本的日期检查,但是上面的第二种日期格式无法通过正则表达式我如何在javascript中禁止宽大的日期?,javascript,regex,date,Javascript,Regex,Date,我试图验证字符串是否为有效日期。parsedateString或new DateString都非常宽松。例如,像2000年14月14日这样的日期显示为2001年2月14日。我尝试了一个正则表达式,但现在我需要验证多个mm/dd/yyyy,我还需要验证yyyy-mm ddThh:mm:ss,例如1951-02-05T00:00:00 我现在正在使用正则表达式和一些基本的日期检查,但是上面的第二种日期格式无法通过正则表达式 function isDate(dateToCheck) { if
function isDate(dateToCheck) {
if (dateToCheck == "" || dateToCheck == null) { return true; }
var timestamp = Date.parse(dateToCheck);
var d = new Date(timestamp);
var re = /(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d/;
var valid = re.test(dateToCheck);
valid = valid && !isNaN(timestamp);
valid = valid && d.getFullYear() > 1900 && d.getFullYear() < 2100;
return valid;
}
regex专门用于mm/dd/yyyy,其中月和日都是两位数,一位数的月取前导零,不允许无效的月或日,如14为月或32为日。年份可以是1900年到2099年之间的任何年份
它不是气密的。它将允许2000年2月31日,这是无效的,因为2月从来没有31天
如何在不允许宽松日期的情况下验证这两种日期格式?查看moment.js及其所有解析选项 它们是一个isValid函数,可用于验证输入字符串是否正确
moment("not a real date").isValid(); // false
如果将其与日期验证字符串组合,则会得到所需的结果:
更新:我使用Moment.js制作了一个完整的工作示例代码。您可以为指定多种格式,以便在返回isValid之前尝试
看看moment.js及其所有解析选项 它们是一个isValid函数,可用于验证输入字符串是否正确
moment("not a real date").isValid(); // false
如果将其与日期验证字符串组合,则会得到所需的结果:
更新:我使用Moment.js制作了一个完整的工作示例代码。您可以为指定多种格式,以便在返回isValid之前尝试
实际上,您可以用一种非常酷的方式来处理这个问题,对其本身使用宽松的日期功能。首先使用mm/dd/yyyy示例,首先确保该值与该格式匹配,如果匹配,则使用该值创建新的日期对象: 然后,使用该新值重新生成日期字符串:
var checkDateMonth = checkDateVal.getDate();
var checkDateDay = checkDateVal.getMonth() + 1;
var checkDateYear = checkDateVal.getFullYear();
// force two digits for the day and month, if necessary
checkDateMonth = (checkDateMonth < 10) ? "0" + checkDateMonth : checkDateMonth;
checkDateDay = (checkDateDay < 10) ? "0" + checkDateDay : checkDateDay;
var checkDateString = checkDateMonth + "/" + checkDateDay + "/" + checkDateYear;
如果用户输入的日期字符串与date对象创建的日期字符串不匹配,则意味着该对象被迫调整输入值以创建实际日期。这意味着原始输入值是一个无效的日期值
这是您的支票
同样的逻辑也适用于您提到的较长日期格式。我建议在开始时使用两个正则表达式值来确定原始输入的格式,然后将其作为标志来驱动逻辑下游,例如。,如何构建checkDateString以查看输入是否有效。您实际上可以通过一种非常酷的方式对其自身使用宽松的日期功能来处理此问题。首先使用mm/dd/yyyy示例,首先确保该值与该格式匹配,如果匹配,则使用该值创建新的日期对象: 然后,使用该新值重新生成日期字符串:
var checkDateMonth = checkDateVal.getDate();
var checkDateDay = checkDateVal.getMonth() + 1;
var checkDateYear = checkDateVal.getFullYear();
// force two digits for the day and month, if necessary
checkDateMonth = (checkDateMonth < 10) ? "0" + checkDateMonth : checkDateMonth;
checkDateDay = (checkDateDay < 10) ? "0" + checkDateDay : checkDateDay;
var checkDateString = checkDateMonth + "/" + checkDateDay + "/" + checkDateYear;
如果用户输入的日期字符串与date对象创建的日期字符串不匹配,则意味着该对象被迫调整输入值以创建实际日期。这意味着原始输入值是一个无效的日期值
这是您的支票
同样的逻辑也适用于您提到的较长日期格式。我建议在开始时使用两个正则表达式值来确定原始输入的格式,然后将其作为一个标志来驱动下游逻辑,例如,需要如何构建checkDateString以查看输入是否有效。它们都可以通过此验证
# /^(?:(?:(?:19|20)\d\d[- \/.](?:0[1-9]|1[012])[- \/.](?:0[1-9]|[12][0-9]|3[01])T\d{2}:\d{2}:\d{2})|(?:(?:0[1-9]|1[012])[- \/.](?:0[1-9]|[12][0-9]|3[01])[- \/.](?:19|20)\d{2}))$/
^
(?:
(?:
(?: 19 | 20 )
\d\d [- /.]
(?: 0 [1-9] | 1 [012] )
[- /.]
(?: 0 [1-9] | [12] [0-9] | 3 [01] )
T \d{2} : \d{2} : \d{2}
)
| (?:
(?: 0 [1-9] | 1 [012] )
[- /.]
(?: 0 [1-9] | [12] [0-9] | 3 [01] )
[- /.]
(?: 19 | 20 )
\d{2}
)
)
$
它们都可以用这个进行验证
# /^(?:(?:(?:19|20)\d\d[- \/.](?:0[1-9]|1[012])[- \/.](?:0[1-9]|[12][0-9]|3[01])T\d{2}:\d{2}:\d{2})|(?:(?:0[1-9]|1[012])[- \/.](?:0[1-9]|[12][0-9]|3[01])[- \/.](?:19|20)\d{2}))$/
^
(?:
(?:
(?: 19 | 20 )
\d\d [- /.]
(?: 0 [1-9] | 1 [012] )
[- /.]
(?: 0 [1-9] | [12] [0-9] | 3 [01] )
T \d{2} : \d{2} : \d{2}
)
| (?:
(?: 0 [1-9] | 1 [012] )
[- /.]
(?: 0 [1-9] | [12] [0-9] | 3 [01] )
[- /.]
(?: 19 | 20 )
\d{2}
)
)
$
Date.parse'14/14/2000'返回NaN-。parse返回提供日期的整数转换。如果为NaN,则日期无效。新数据'14/14/2000'返回无效日期。@Bic Date.IE10中的解析'14/14/2000'返回98213400000。我不能相信一个只能在IE10上运行的内部网站,这很公平。让IE做不同的事情,让生活变得艰难。@Bic至少我不必担心跨浏览器修复…我添加了一个完整的例子来说明我的反应。如果它对您有效,请选择它作为答案。Date.parse'14/14/2000'返回NaN-。parse返回提供日期的整数转换。如果为NaN,则日期无效。新数据'14/14/2000'返回无效日期。@Bic Date.IE10中的解析'14/14/2000'返回98213400000。我不能相信一个只能在IE10上运行的内部网站,这很公平。让IE做不同的事情,让生活变得艰难。@Bic至少我不必担心跨浏览器修复…我添加了一个完整的例子来说明我的反应。如果它适合你,请选择它作为答案。当不同的格式出现时,这会变得复杂。我
“您必须知道如何准确地将日期重新生成为字符串。您需要知道这一点,以便在正则表达式中应用适当的格式检查。”。但实际上,唯一改变的是如何重建字符串。其余的逻辑是常见的。但是,同样,即使使用插件,您支持的每种新格式都会使事情变得更加复杂。多年来,我写了很多数据验证,信不信由你,这是我发现的检查格式正确的无效日期值的最快方法。当可能出现不同格式时,这会变得复杂。我必须知道如何准确地将日期重建为字符串。为了在正则表达式中应用适当的格式检查,您需要知道这一点。但实际上,唯一改变的是如何重建字符串。其余的逻辑是常见的。但是,同样,即使使用插件,您支持的每种新格式都会使事情变得更加复杂。多年来我写了很多数据验证,信不信由你,这是我发现的检查格式正确的无效日期值的最快方法。
# /^(?:(?:(?:19|20)\d\d[- \/.](?:0[1-9]|1[012])[- \/.](?:0[1-9]|[12][0-9]|3[01])T\d{2}:\d{2}:\d{2})|(?:(?:0[1-9]|1[012])[- \/.](?:0[1-9]|[12][0-9]|3[01])[- \/.](?:19|20)\d{2}))$/
^
(?:
(?:
(?: 19 | 20 )
\d\d [- /.]
(?: 0 [1-9] | 1 [012] )
[- /.]
(?: 0 [1-9] | [12] [0-9] | 3 [01] )
T \d{2} : \d{2} : \d{2}
)
| (?:
(?: 0 [1-9] | 1 [012] )
[- /.]
(?: 0 [1-9] | [12] [0-9] | 3 [01] )
[- /.]
(?: 19 | 20 )
\d{2}
)
)
$