2 回答
TA贡献1874条经验 获得超12个赞
你可以使用regex来保证结构。
const dates = ['2019-99-99', 'bla-bal-bla', '2019-11-20'];
const wrongdates = dates.filter(date => !/\d{4}\-[01]\d\-[0-3]\d/.test(date));
console.log(wrongdates);
TA贡献1864条经验 获得超6个赞
我会使用正则表达式。这个应该适合你:
\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])
这将检查:
\d{4}
- four digits
-
- followed by a hyphen
(?:0[1-9]|1[0-2])
- one of:
a. a zero followed by any number 1 to 9 (months 01 to 09)
b. a one followed by any number 0 to 2 (months 10 to 12)
-
- followed by a hyphen
(?:0[1-9]|[12][0-9]|3[01])
- using the same logic as above, any number from 01 to 31.
这些更复杂的组将意味着超出可接受范围的日期(例如 2019-49-40)也将失败。
如果您想接受像 2019-1-4 这样的日期(考虑到您正在使用 SQL,这可能是一个糟糕的计划,但以防万一),只需?在日期和月份部分的零之后放置一个 ( \d{4}-(?:0?[1-9]|1?[0-2])-(?:0?[1-9]|[12]?[0-9]|3?[01])),允许它们匹配0或1时间(使它们可选)。
希望您注意到,如果您唯一的数据源是一个普通的旧字符串,则无法验证是否有人输入了错误的日期(即,2019 年 2 月 9 日 → 2019-02-09 和 2019-09-02 都将是“正确的”)。
要在 Javascript 中执行此操作,您可以使用该RegExp.prototype.test方法。Array.prototype.filter如果您正在创建一个新数组(并且Array.prototype.map如果您正在使用 DOM 元素),您也可以利用它。
const dates = [...document.querySelectorAll('input')];
const wrongdates = dates.map(el => el.value).filter(date => !/\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])/.test(date));
console.log(wrongdates)
<input type="text" value="2019-01-31">
<input type="text" value="2019-15-52">
<input type="text" value="2005-09-17">
<input type="text" value="2001-06-13">
<input type="text" value="2001-06-13">
<input type="text" value="2001-06-13">
<input type="text" value="06-28-13">
<input type="text" value="Jan-12-2019">
您需要!
因为在匹配时RegExp.test
返回true
,并且您正在尝试列出不正确的日期。
添加回答
举报