Как проверить дату истечения срока действия кредитной карты с помощью jQuery - PullRequest
2 голосов
/ 12 июля 2010

Мне нужна помощь при проверке значения ввода по текущей дате.По сути, мне нужно добавить addMethod для плагина jquery validate, который потребовал бы, чтобы формат даты экспозиции CC MM / YYYY был будущей датой не более чем через 10 лет.Я искал 2 дня и еще не нашел хорошего решения!Пожалуйста, помогите!

Ответы [ 4 ]

2 голосов
/ 12 июля 2010

вы можете попробовать что-то похожее на это:

$.validator.addMethod('ccDate', function (value) {
        var inDate = new Date(value);
        var futureDate = new Date();
        futureDate.setYear(futureDate.getFullYear() + 10);
        var diff = inDate - futureDate;
        return (diff < 0);
    }, function() {
                    var $msg = 'Date must be within 10 years';  
                    return $msg;
        });

, а затем просто добавьте вызов к этому новому типу (ccDate) для этого поля в разделе правил вызова проверки.вам, возможно, придется настроить способ разбора значения поля, чтобы создать правильную дату, но идея здесь.

1 голос
/ 25 августа 2011

Я немного изменил код.Я думаю, что следующее решение будет работать для проверки срока действия кредитной карты.Это позволяет m / yy или m / yyyy формат даты истечения.

$.validator.addMethod(
    "ccexpdate",
function (value, element) {

    // Initialize todays date   i.e start date
    var today = new Date();
    var startDate = new Date(today.getFullYear(),today.getMonth(),1,0,0,0,0);

    // Initialize End/Expiry date i.e. adding 10 years to expire
    var futureLimitDate= new Date(today.getFullYear()+10,today.getMonth(),1,0,0,0,0);
    var expDate = value;

    var expYearCheck='';

    // Check Date format
    var separatorIndex = expDate.indexOf('/');
    if(separatorIndex==-1)return false; // Return false if no / found

    var expDateArr=expDate.split('/'); 
    if(expDateArr.length>2)return false; // Return false if no num/num format found

    // Check Month for validity
    if(eval(expDateArr[0])<1||eval(expDateArr[0])>12)
    {
        //If month is not valid i.e not in range 1-12
        return false;
    }

    //Check Year for format YY or YYYY
    switch(expDateArr[1].length)
    {
        case 2:expYearCheck=2000+parseInt(expDateArr[1], 10);break; // If YY format convert it to 20YY to it
        case 4:expYearCheck=expDateArr[1];break; // If YYYY format assign it to check Year Var
        default:return false;break;
    }


    // Calculated new exp Date for ja  
    expDate=new Date(eval(expYearCheck),(eval(expDateArr[0])-1),1,0,0,0,0);



    if(Date.parse(startDate) <= Date.parse(expDate))
    {
        if(Date.parse(expDate) <= Date.parse(futureLimitDate))
        {
            // Date validated
            return true;    
        }else
        {

            // Date exceeds future date
            return false;
        }

    }else
    {

        // Date is earlier than todays date
        return false;
    }


},
"Must be a valid Expiration Date."
);
0 голосов
/ 11 сентября 2010

Ответ находится здесь внизу: http://forum.jquery.com/topic/credit-card-expiration-check

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

var year = 2000+parseInt($year.val(), 10);
0 голосов
/ 13 июля 2010

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

$.validator.addMethod(
"Future",
function (value, element) {
    var today = new Date();
    var startDate = new Date(today.getFullYear(),today.getMonth(),1,0,0,0,0);
    var expDate = value;
    var separatorIndex = expDate.indexOf('/');
    expDate = expDate.substr( 0, separatorIndex ) + '/1' + expDate.substr( separatorIndex );
    return Date.parse(startDate) <= Date.parse(expDate);
},
"Must be a valid Expiration Date."
);

then in rules: {
  elementName: {
    Future: true
  }
},
messages: {

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...