我正在为学校做一项作业,我们使用 JavaScript(我只允许使用 JavaScript)来验证付款页面的表单。这是我第一次使用 JavaScript,所以我感觉有点失落......
我面临着验证到期日期的任务,要求是:
- 数字必须正好是 2-2 位数字(格式为 mm-yy)
- mm 需要 >01 和 <12
- 并且到期日期必须晚于今天
到目前为止,我只能指定前两个要求,并且无法弄清楚如何根据今天的日期检查日期。
html
<form>
<label for="expiryDate">Expiry Date</label>
<input type="text" name="expiryDate" id="expiryDate" />
<input type="submit" value="Check out" />
</form>
JavaScript
var expiryDate = document.getElementById("expiryDate").value;
if (!expiryDate.match(/^[0][1-9]|[1][0-2]-[0-9]{2}$/)){
errMsg = errMsg + "The expiry date needs to be mm-yy and consist of a valid date.\n";
result = false;
}
因此,如果有人知道如何帮助我,我将不胜感激!
最佳答案
我总是惊讶于程序员宁愿花精力为用户构建紧身衣,也不愿编写用户友好的代码。
月份标准似乎不正确,">01 和 <12"推断出从 2 到 11(含)的值,我希望 ">=1 和 <=12"是有意的。
要完全按照作业要求进行操作,您可以执行以下操作:
/* Check that the provided string is:
** - exactly 2-2 digits in the format mm-yy
** - mm is >= 01 and <= 12
** - expiry date is this month or later
*/
function validateExpiryDate(s) {
// Check 2-2 digits
if (!/\d\d-\d\d/.test(s)) {
return 'Expiry date format must be MM-YY: ' + s;
}
// Check month is 1 to 12 inclusive
var b = s.split('-');
if (b[0]<1 || b[0]>12) {
return 'Expiry month must be from 00 to 12: ' + b[0];
}
// Check is this month or later
var d = new Date()
var c = d.getFullYear()/100 | 0 + '';
if (new Date(c + b[1], b[0], 1) < d) {
return 'Expiry date must be this month or later: ' + s;
}
return true;
}
// Some tests
['01-17','12-17','foo','13-20','9-18'].forEach(function(s){
console.log(validateExpiryDate(s));
})
但是,为了更加用户友好,您可以很容易地接受单位数字和各种分隔符。此外,您可以直接切入正题并测试输入的值是否生成合适的到期日期。您还可以将输入的字符串重新格式化为所需的格式,例如:
// Validate expiry date in m-yy format
// Separator can be any non-digit
function checkExpiryDate(s) {
var b = s.split(/\D/);
var d = new Date();
var century = d.getFullYear()/100 | 0;
// Generate date for first day of following month
var expires = new Date(century + b[1], b[0], 1);
return d < expires;
}
// Reformat date in m/yy format to mm-yy strict
function formatExpiry(s) {
var b = s.split(/\D/);
function z(n){return (n<10?'0':'') + +n}
return z(b[0]) + '-' + z(b[1]);
}
['1/1','4-17','03-17','3-18','06/19','3.19','foo'].forEach(function(s) {
console.log('String "' + s + '" converts to "' +
formatExpiry(s) + '" and is ' +
(checkExpiryDate(s)? '' : 'not ') + 'valid.');
});
因此,用户友好也需要编写更少的代码。 ;-)
计算世纪有点过头了,您可以只使用“20”,并期望您的代码不会在 2095 年运行,届时到期日期将开始有“21”世纪。
关于javascript - 在 JavaScript 中根据今天的日期验证信用卡到期日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43648170/