Javascript出生日期难题

Javascript date of birth conundrum

本文关键字:难题 出生日期 Javascript      更新时间:2023-09-26

我需要验证原始出生日期字段输入,格式为:

"唔�

其中字符串的前 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测试日期是否解析失败。