javascript - 在 JavaScript 中根据今天的日期验证信用卡到期日期

标签 javascript date

我正在为学校做一项作业,我们使用 JavaScript(我只允许使用 JavaScript)来验证付款页面的表单。这是我第一次使用 JavaScript,所以我感觉有点失落......

我面临着验证到期日期的任务,要求是:

  1. 数字必须正好是 2-2 位数字(格式为 mm-yy)
  2. mm 需要 >01 和 <12
  3. 并且到期日期必须晚于今天

到目前为止,我只能指定前两个要求,并且无法弄清楚如何根据今天的日期检查日期。

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/

相关文章:

PYTHON 3.8 日期范围

javascript - 用户填写邮政编码时如何获取街道名称和城市

javascript - 在html中选择屏幕坐标(x,y)处的单个单词

javascript - 随机图像服务

javascript - 如何在基于 PHP composer 的包中从基于 NPM 的包加载 Assets ?

mysql - Google Apps 脚本、JDBC 和 MySQL 不适用于日期 0000-00-00

php - 不同的服务器是否应该将 unix 时间戳转换为不同的日期?

javascript - 在 Javascript 中处理时间跨度

Javascript:拆分为多个变量

java - Joda-Time 中两个日期之间的天数