信用卡有效期的最长年份


149

对于信用卡,各种在线服务对于最大有效期都有不同的值。

例如:

  • 大本营:+15年(2025)
  • 亚马逊:+20年(2030)
  • 贝宝:+19年(2029)

这里的合理最大值是多少?有官方的指导吗?


1
各大在线商店的不一致之处强烈表明没有官方指南。
马特·鲍尔

10
我喜欢用简单的文本输入来要求到期年的网站…
Quentin 2010年

1
@Quentin优于阻止提交的错误验证,除非用户知道如何使用Web浏览器的开发人员。工具。
Alastair 2013年

4
@Alastair-我的评论并非出于讽刺。
昆汀

1
@Quention公平。省略号把我扔了。:-P对于用户来说,这显然是最不令人讨厌的实现,但是从开发/业务的角度来看,只会有太多错误的输入(这可能会导致销售损失)。
Alastair 2013年

Answers:


65

没有官方指南,因为信用卡发行商可以选择何时发行的信用卡。实际上,他们发行卡的时间越来越长。如果您要确定将来应该走多远,您应该考虑有效期,为了安全起见,请给您的客户很多年的选择时间。这样,您将来就可以证明您的应用程序。

仅供参考,许多信用卡发行商在确定是否批准购买信用卡时不使用到期日期。因此,如果您担心提供的日期不正确,处理器最终将最终决定是否批准交易,因此我不必担心。

2017年7月:一名最终用户所持卡的有效期从现在开始将近50年。


2
他们可能会在没有正确代码的情况下批准,但也可能会对没有正确代码的交易向您收取更高的费用。
BVernon 2014年

这仅适用于AVS和CVV验证。
约翰·孔德

的确,大多数发行者都会批准该交易,但是,如果不向用户提供其信用卡年份的选择,则可能会阻止他继续进行交易。我只想再加上50年,就不会有发行人打算让您保留那么长时间的塑料,即使那是一个很长的烦人的跌幅。
毛罗(Mauro)2015年

16

我可以在当前日期的年份中动态添加+ 15-20年,或者提供年份的文本框输入(我个人认为,键入两位数字要比滚动浏览年份列表更快)。


7
除非您使用的是手机。您可能更喜欢在过去的几年中刷卡。要考虑的事情。
jedmao 2010年

10
@sfjedi很好,请不要忘记,在大多数浏览器中,您仍然可以键入数字,它会自动选择。
Kevin Wiskia 2011年

1
关于文本输入vs选择的要点。我一直喜欢文本输入,但是最近在Android和iOS上进行了一些UI测试之后,我发现选择选项似乎稍微容易一些。但是,使用HTML5的type = number可以快速拉起移动设备上的数字键盘,因此也很容易。它认为可以归结为验证错误。预定义选择选项可能会减少错误。
克林特·帕奇

我不确定这是否可以在移动设备上正常工作,但是下拉菜单/文本框呢?您可以输入一个值,也可以像平常一样选择一个值。
松饼人

4

作为理论上限,我建议您不必考虑持卡人的预期寿命。维基百科在其关于活人传记的编辑标准中做到了这一点:

除非可靠的消息来源证实了该人的死亡,否则任何未满115岁出生的人都将受到本政策的保护。除非列出最高年龄的人,否则115岁以上的人被认为已经死亡。

因此,在您的代码中,查找当年,加115,然后将其用作信用卡到期日的理论上限。您再也不必触碰该代码。


2
我会说这是非常理论性的。拥有旧卡的人可能会在他们的第一个生日到出生那天之间的某个时候被发行。然后他们必须活到115岁!
2012年

40
伙计们,你们这些强壮的家伙正在冒烟!
艺术

7
SWIM认为(当时)解析Wikipedia的最高年龄者列表以限制年龄输入字段为好主意,max以防万一最高年龄者一旦他们满116 岁就使用了表格...:[
Alastair

不一定绑定到个人的公司卡怎么办?在这种情况下,没有“理论”限制。
aaronbauman

3
但是根据美国最高法院的说法,@ aaronbauman是一家公司。因此,该卡只能使用115年!:-)
Stonetip

1

这是一个Javascript代码段,可用于显示CC验证的未来年份的可自定义列表:

    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>


0

以下是美国顶级在线零售商的样本:

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

-1

好的,@ Alistair。

这是ASP.NET MVC中的月份和年份。将此添加到您的视图模型:

public IList<SelectListItem> Months = new List<SelectListItem>() { 
    new SelectListItem() { Text="Jan", Value="01" },
    new SelectListItem() { Text="Feb", Value="02" },
    new SelectListItem() { Text="Mar", Value="03" },
    new SelectListItem() { Text="Apr", Value="04" },
    new SelectListItem() { Text="May", Value="05" },
    new SelectListItem() { Text="Jun", Value="06" },
    new SelectListItem() { Text="Jul", Value="07" },
    new SelectListItem() { Text="Aug", Value="08" },
    new SelectListItem() { Text="Sep", Value="09" },
    new SelectListItem() { Text="Oct", Value="10" },
    new SelectListItem() { Text="Nov", Value="11" },
    new SelectListItem() { Text="Dec", Value="12" },
};
public IEnumerable<SelectListItem> Years
{
    get
    {
        return new SelectList(Enumerable.Range(DateTime.Today.Year, 15));
    }
}

这在您看来:

<fieldset>
    <legend>Card expiration</legend>
    <div style="float: left;">
        <div class="editor-label">
            @Html.LabelFor(model => model.ExpirationMonth)
        </div>
        <div class="editor-field">
            @Html.DropDownListFor(model => model.ExpirationMonth, Model.Months)
            @Html.ValidationMessageFor(model => model.ExpirationMonth)
        </div>
    </div>
    <div style="float: left;">

        <div class="editor-label">
            @Html.LabelFor(model => model.ExpirationYear)
        </div>
        <div class="editor-field">
            @Html.DropDownListFor(model => model.ExpirationYear, Model.Years)
            @Html.ValidationMessageFor(model => model.ExpirationYear)
        </div>
    </div>
</fieldset>

-1

尽管第二个示例的运行速度是第一个示例的两倍,但是您仍然可以获取日期并从中提取年份而不是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
只是上述内容的一种变体,最好添加要选择的年份并为月份和年份选择添加下拉列表。如果仅显示单个文本字段,则用户倾向于输入不同的月份和年份变体。
路易·费雷拉

-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";
    }
?>

-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>

这大大减少了这些last year从表格中删除的新年请求的数量。

循环的精简版本运行速度大约是两倍:

<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相对不是,但是我添加了一个为您运行两倍的版本。:P
Alastair

-6
<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> 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.