Максимальный год истечения срока действия кредитной карты - PullRequest
145 голосов
/ 23 марта 2010

Различные онлайн-сервисы имеют разные значения для максимального срока годности, когда речь идет о кредитных картах.

Например:

  • Базовый лагерь: +15 лет (2025)
  • Амазонка: +20 лет (2030)
  • Paypal: +19 лет (2029)

Какой здесь разумный максимум? Есть ли официальные рекомендации?

Ответы [ 10 ]

62 голосов
/ 23 марта 2010

Официального руководства не существует, поскольку эмитенты кредитных карт могут выбрать каждый из них по истечении срока действия выдаваемых ими карт. На самом деле они выпускают карты на все более длительные периоды времени. Если вы пытаетесь определить, как далеко в будущем вы должны учитывать сроки годности, допустите ошибку и предоставьте своим клиентам много лет на выбор. Таким образом, вы подтвердите свое будущее.

К вашему сведению, многие эмитенты кредитных карт не используют дату истечения срока действия при определении, следует ли одобрить покупку кредитной карты. Поэтому, если вы беспокоитесь о том, что указана неправильная дата, обработчик в конечном итоге получит окончательное решение о том, одобрена ли транзакция или нет, поэтому я не буду беспокоиться об этом.

Июль 2017 : у конечного пользователя только что была карта, срок действия которой истек почти через 50 лет.

16 голосов
/ 23 марта 2010

Я бы либо динамически добавил + 15-20 лет к году текущей даты, либо предоставил бы ввод для текстового поля для года (лично я считаю, что быстрее набрать две цифры, чем пролистывать список лет).

4 голосов
/ 16 декабря 2011

В качестве теоретического верхнего предела я предлагаю вам не рассматривать больше, чем ожидаемый срок службы держателя карты. Википедия делает это в своих редакционных стандартах для биографий живых людей :

Любой человек, родившийся менее 115 лет назад, подпадает под действие этой политики, если только надежный источник не подтвердил его смерть. Люди старше 115 лет считаются мертвыми, если они не указаны в списке пожилых людей.

Итак, в вашем коде найдите текущий год, добавьте 115 и используйте его в качестве теоретического верхнего предела для даты окончания срока действия кредитной карты. Вам никогда не придется больше трогать этот код.

1 голос
/ 29 апреля 2015

Вот фрагмент кода 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 голосов
/ 24 октября 2016
<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> 
0 голосов
/ 30 июня 2016

Хотя второй пример выполняется вдвое быстрее, чем первый, вы все равно получаете дату и извлекаете год из нее 20, а не 40 раз. Лучшее развертывание цикла:

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

Это будет примерно в 20 раз быстрее, чем в два раза быстрее, а также устраняет небольшую ошибку в исходном коде, заключающуюся в том, что год может измениться от одной выборки даты к следующей, что приведет к неожиданному, хотя в этом случае безвредному , результаты.

0 голосов
/ 28 ноября 2014

Если вам нужно решение, которое не дает трехзначных лет 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";
    }
?>
0 голосов
/ 13 сентября 2013
<?php 
$y = gmdate("Y");
$x = 20;
$max = ($y + $x);
while ($y <= $max) {
echo "<option value='$y'>$y</option>";
$y = $y + 1;
}
?>
0 голосов
/ 27 июля 2013

Хороший звонок, @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>
0 голосов
/ 25 января 2013

Прочитав верхний срок действия OP для Amazon на 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...