信用卡有效期的最大年限是多少?

156

不同的在线服务在信用卡到期年份上有不同的最大值。

例如:

  • Basecamp:+15年(2025年)
  • 亚马逊:+20年(2030年)
  • Paypal:+19年(2029年)

这里的合理最大值是什么?是否有官方指导意见?


1
各大在线商店的不一致性非常明显,这表明没有官方指南。 - Matt Ball
10
我喜欢那些通过简单的文本输入要求到期年份的网站... - Quentin
2
@Quentin,这比防止提交的错误验证更好,除非用户知道如何使用网络浏览器的开发工具。 - Alastair
5
@Alastair — 我的评论并非讽刺意味。 - Quentin
1
@Quention 好的,我误解了省略号。:-P对于用户来说,这显然是最不烦人的实现方式,但从开发/商业角度来看,会有很多错误的输入(这可能导致销售损失)。 - Alastair
如果你对移动应用程序感到好奇,Google Play似乎也支持20年以上的版本。 - John61590
10个回答

76

信用卡发行方没有官方准则来规定信用卡过期日期。实际上,他们正在越来越长的时间内发行信用卡。如果您试图确定未来应该为多远的到期日进行适应,请以保险起见为客户提供更多年份的选择。这样可以使您的应用程序具备未来兼容性。

另外,许多信用卡发行方在决定是否批准信用卡购买时并不使用过期日期。因此,如果您担心提供了错误的日期,则处理器最终将决定是否批准交易,所以不必担心。

2017年7月:刚刚遇到一位最长有效期将近50年的信用卡最终用户。


2
他们可能会在没有正确代码的情况下批准,但是对于没有正确代码的交易,他们也可能会向您收取更高的费率。 - BVernon
这只适用于AVS和CVV验证。 - John Conde
虽然大多数发卡方都会批准该交易,但是如果不为用户提供他的信用卡年份选项,可能会使他不愿继续进行交易。我只会添加50年,并且期望没有任何发卡方会认为您要保存那么长时间的塑料卡片,即使这是一项长而有点烦人的下拉菜单。 - Mauro

17

我可以动态地将当前日期的年份增加15-20年,或者提供一个文本框输入年份(我个人认为,手动输入两位数字比浏览年份列表更快)。


7
除非你使用手机,否则也许可以考虑通过年份轻松翻阅。这是值得考虑的事情。 - jedmao
10
@sfjedi提出了一个好观点,不要忘记大多数浏览器仍然可以输入数字并自动选择。 - Kevin Wiskia
1
关于文本输入和选择的观点很好。我一直更喜欢文本输入,但最近在Android和iOS上进行UI测试时,发现选择选项似乎稍微更容易一些。然而,使用HTML5的type=number可以快速在移动设备上调出数字键盘,这也使事情变得容易。我认为这归结于验证错误;预定义的选择选项可能会有更少的错误。 - Clint Pachl
我不确定这在移动设备上是否有效,但是下拉框/文本框怎么样?您可以输入一个值或像平常一样选择一个。 - The Muffin Man

5
以下是美国顶尖的在线零售商示例:
RETAILER        WINDOW IN YEARS
Amazon          20
Walmart         10
Apple           NA (TEXT FIELD)
Home Depot      19
Best Buy        10
Target          NA (TEXT FIELD)
eBay            NA (TEXT FIELD)
Google          19

4
作为理论上的上限,我建议您不需要考虑持卡人的预期寿命。维基百科在其生者传记编辑标准中采用了这种方式:

除非可靠来源已经证实该个体已经去世,否则覆盖任何115年前出生的人。超过115岁的人被认为已经死亡,除非列在最长寿命的人名单上。

因此,在您的代码中,查找当前年份,加上115年,并将其用作信用卡到期日的理论上限。您将永远不必再次触及该代码。

2
我认为这非常理论化。持有那么老的卡片的人必须是在他们出生后的第一个生日和出生当天之间发放的。然后他们必须活到115岁! - jimp
43
你们抽的东西真是够猛的! - Art
7
SWIM认为解析维基百科的最长寿者列表来将年龄输入限制在该“max”范围内似乎是个好主意(当时是这样想的),以防最长寿者在他们116岁后使用该表单... :[ - Alastair
一个不一定与个人绑定的公司卡怎么样?在这种情况下,就没有“理论”限制了。 - aaronbauman
3
但是,根据美国最高法院的规定,公司被视为是一个人。因此这张卡片只能使用115年! :-) - Stonetip
3
信用卡有一个以MM/YY格式表示的到期日期。因此,我们谈论的是100年的上限(否则您无法确定YY=22是指2022年还是2122年...)。 - targumon

1

这里是一个Javascript代码片段,您可以使用它来显示可自定义的信用卡验证未来年份列表:

    var yearsToShow = 20;
    var thisYear = (new Date()).getFullYear();
    for (var y = thisYear; y < thisYear + yearsToShow; y++) {
      var yearOption = document.createElement("option");
      yearOption.value = y;
      yearOption.text = y;
      document.getElementById("expYear").appendChild(yearOption);
    }
          <label for="expiration">Expiration Date</label>
          <span id="expiration">
            <select id="expMonth" name="expMonth">
              <option disabled="true">Month</option>
              <option value="1">Jan</option>
              <option value="2">Feb</option>
              <option value="3">Mar</option>
              <option value="4">Apr</option>
              <option value="5">May</option>
              <option value="6">Jun</option>
              <option value="7">Jul</option>
              <option value="8">Aug</option>
              <option value="9">Sep</option>
              <option value="10">Oct</option>
              <option value="11">Nov</option>
              <option value="12">Dec</option>
            </select>
            <select id="expYear" name="expYear">
            </select>
          </span>


-2
如果您想要一个不会产生三位数年份2100+的解决方案,那么您必须对日期进行取模,相应地,您必须在xx00-xx09年填充前导零以避免得到单个数字年份。
这将从2080年开始非常重要。
<?php
    for($i=0;$i<=20;$i++){
        $aktDate = sprintf("%02d", ((date('y')+$i)%100));
        echo "<option value=\"{$aktDate}\">{$aktDate}</option>\n";
    }
?>

-2

虽然第二个示例的运行速度是第一个示例的两倍,但您仍然需要从日期中提取年份20次而不是40次。更好的循环展开方式如下:

$StartDate=date('Y');
$EndDate=$StartDate+21;
for($i=$StartDate;$i<$EndDate;$i++){
    echo "<option value='".$i."'>".substr($i,2)."</option>\n";

这将比两倍速度更快的示例快大约20倍,并且还解决了原始代码中的一个小错误,即年份可能会从一次获取日期到下一次发生变化,导致意外但在这种情况下无害的结果。


-2
<?php 
$y = gmdate("Y");
$x = 20;
$max = ($y + $x);
while ($y <= $max) {
echo "<option value='$y'>$y</option>";
$y = $y + 1;
}
?>

1
这只是上述内容的一个变化,最好将年份添加到选择器中,并为月份和年份选择添加下拉菜单。如果仅提供单个文本字段,用户往往会以不同的方式输入月份和年份变体。 - Louis Ferreira

-3

在阅读了OP对于亚马逊20年有效期的要求后,我用PHP编写了这个简单的解决方案:

<select name='Expiry-Year'>
    <option value="">yy</option>
    <?php
    for($i=0;$i<21;$i++){
        echo "<option value='".(date('Y')+$i)."'>".(date('y')+$i)."</option>\n";
    }
    ?>
</select>

这大大减少了在表单中删除“去年”这一请求的数量。

精简版本的循环运行速度快了约两倍:

<select name='Expiry-Year'>
    <option value="">yy</option>
    <?php
    for($i=date('Y');$i<date('Y')+21;$i++){
        echo "<option value='".$i."'>".substr($i,2)."</option>\n";
    }
    ?>
</select>

4
你意识到每次调用 date('Y')date('y') 20 次都会相当慢吗? - Alexis Wilke
相对而言,@Alexis,我为你添加了一个运行速度快两倍的版本。:P - Alastair

-7
<script type="text/javascript">
  var select = $(".card-expiry-year"),
  year = new Date().getFullYear();

  for (var i = 0; i < 20; i++) {
      select.append($("<option value='"+(i + year)+"' "+(i === 0 ? "selected" : "")+">"+(i + year)+"</option>"))
  }
</script> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接