我需要验证原始出生日期字段输入,格式为:
"唔�
其中字符串的前 3 个字符必须是一年中月份可接受的 3 个字母缩写。它可以是小写的,也可以是大写的,或者混合的,只要它拼写出jan或feb或mar等。据我所知,没有内置方法具有一个月这种特定格式的现成数组,以便能够与用户输入进行比较。我在想我也许可以在 for 循环中使用 localeCompare()
方法来测试输出是否为 0,然后相应地附加错误消息。
function dateTester() {
var d = new Date(),
i,
mo = [],
moIsValid;
for (i = 0; i < 12; i += 1) {
d.setMonth(i);
mo.push(d.toLocaleString().split(' ')[1].substr(0, 3));
}
return new RegExp('^(' + mo.join('|') + ')', 'i');
}
var moIsValid = dateTester();
alert(moIsValid.test('fEb1992'));
如果您不希望用户当天的当前区域设置名称有效,则只需toLocaleString()
切换到 toString()
。但是,你为什么不这样做呢:
var moIsValid = /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i;
alert(moIsValid.test('fEb1992'));
我喜欢这个简洁的函数来验证你的输入:
var months = "janfebmaraprmayjunjulaugsepoctnovdec";
function validate(dateString) {
return dateString.length == 7 &&
!(months.indexOf(dateString.substr(0,3).toLowerCase()) % 3) &&
isFinite(dateString.substr(3));
}
http://jsfiddle.net/gilly3/NR3aG/
除非你真的真的想用"动态"测试检查一个月,否则你可以做:
var months = 'jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec';
months.indexOf('JaN1975'.toLowerCase().substring(0,3)
检查:
console.log(months.indexOf('JaN1975'.toLowerCase().substring(0,3)) != -1);
console.log(months.indexOf('oct1975'.toLowerCase().substring(0,3)) != -1);
console.log(months.indexOf('FEB1975'.toLowerCase().substring(0,3)) != -1);
console.log(months.indexOf('Ja1975'.toLowerCase().substring(0,3)) != -1);
console.log(months.indexOf('091975'.toLowerCase().substring(0,3)) != -1);
http://jsfiddle.net/ELMFu/
给:
true
true
true
false
false
new Date(str.replace(/(D+)(d+)/, "1 $1 $2"))
编辑:使用isNaN
测试日期是否解析失败。