дата истечения срока действия для месяца и года

#javascript #date

#javascript #Дата

Вопрос:

возникли некоторые проблемы при попытке разобраться в этом, полный новичок, когда дело доходит до JavaScript. Я пытаюсь подтвердить форму, более конкретно дату истечения срока действия кредитной карты. например, январь 2011 года был бы недействительным, но декабрь 2011 года был бы действительным и т.д. Это то, что у меня есть до сих пор:

 function ExpiryDate() {

var year
var months

today = new Date();
    expiry = new Date(year, month);
    if (today.getTime() > expiry.getTime())

    return false;
else
    return true;
};
  

моя форма гласит:

 <form id="myform" method="post" action="default.html" onsubmit="return Validate(this);">

<p>Expiration Date: Month

<select name="ExpMon" id="ExpMon" title="select a month"> 
        <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">June</option> 
        <option value="7">July</option> 
        <option value="8">Aug</option> 
        <option value="9">Sept</option> 
        <option value="10">Oct</option> 
        <option value="11">Nov</option> 
        <option value="12">Dec</option> 
 </select>      

 Year:
 <select name="ExpYear" id="ExpYear" title="select a year"> 
     <option value="2010">2010</option> 
     <option value="2011">2011</option> 
     <option value="2012">2012</option> 
     <option value="2013">2013</option>
     <option value="2014">2014</option> 
     <option value="2015">2015</option>
</select></p> 

</form
  

Я не уверен, как использовать идентификаторы, чтобы получить то, что я хочу, буду признателен за любую помощь, заранее спасибо. примечание: У меня есть функция Validate, которая проверяет текстовое поле в моей форме, чтобы я мог каким-то образом прикрепить его к этому.

Ответ №1:

 var year = document.getElementById("ExpYear").value;
var month = document.getElementById("ExpMon").value;
  

Если вы предпочитаете, вы можете использовать вместо этого имена; вам пришлось бы получить Validate для передачи элемента form в качестве параметра, но затем вы можете использовать theForm.ExpYear.value и theForm.ExpMonth.value .

Примечание: многим людям не нравятся инструкции вида, if (today.getTime() > expiry.getTime()) return false; else return true; когда вы можете просто написать return today.getTime() <= expiry.getTime(); .

Комментарии:

1. Спасибо за ваш быстрый ответ. Я нашел ваш совет очень полезным.

Ответ №2:

Нил ответил на ваш вопрос о том, как получить значения ( 1). Я просто хотел добавить, что, ИМХО, было бы лучше для пользователей не позволять вашим пользователям выбирать неприемлемую дату истечения срока действия в первую очередь.

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

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

Ответ №3:

Следующее примет пользовательский ввод, создаст объект date, а затем сравнит его с сегодняшней датой. Одним из ключевых элементов является то, что он найдет последний день текущего месяца, так что, даже если сегодня 3 мая и пользователь выберет «Май 2011» (который действителен для транзакции по кредитной карте), он вернет «действительный».

 function CheckDate() {
    var selectedDate = new Date (document.getElementById("ExpYear").value,document.getElementById("ExpMon").value)
    var nextmonth = selectedDate.setMonth(selectedDate.getMonth()   1);
    var last_date_of_selected_date = new Date(nextmonth -1);
    var today = new Date();
    if (today > selectedDate) {
        alert("Invalid");
    }
    else {
        alert("Valid");
    }
}
  

Вот рабочий jsFiddle, чтобы увидеть это в действии: http://jsfiddle.net/cPApB/3 /

Комментарии:

1. Гораздо лучше использовать формат даты ISO8601, чем формат, зависящий от региона. Кроме того, дата обоих месяцев должна быть установлена одинаковой (скажем, 1-го), а час, минуты и секунды сегодняшнего дня должны быть установлены равными нулю. Самый простой способ — это: var today = new Date(); today = new Date(today.getFullYear(), today.getMonth());

2. @RobG: Хорошая точка зрения на формат даты ISO8601. Я соответствующим образом обновил свой ответ. Тем не менее, он по-прежнему сравнивает текущую дату с последним днем выбранного месяца вместо того, чтобы оба были 1-м, как вы предлагаете. Операционная система сравнивает дату с действительными датами истечения срока действия кредитной карты, которые действительны до конца месяца.

3. Это просто я чего-то не замечаю, или last_date_of_selected_date переменная даже не используется?

Ответ №4:

Попробуйте это:

 var today = new Date();
var expDate = new Date($("#cart-expyear").val(),($("#cart-expmonth").val()-1)); // JS Date Month is 0-11 not 1-12 replace parameters with year and month
if(today.getTime() > expDate.getTime()) {
    console.log("Your Card is expired. Please check expiry date.");
}
  

Ответ №5:

Используйте эту простую проверку

 var expiryYear = $('#<%# DataBinder.Eval (ddlYear,"ClientID") %> option:selected').val();
var expiryMonth = $('#<%# DataBinder.Eval (ddlValidMonths,"ClientID") %> option:selected').val();
            var currentUserDate = $('#<%# DataBinder.Eval (hdnFieldJsonDate,"ClientID") %>').val();
            if (currentUserDate != null amp;amp; expiryMonth != null amp;amp; expiryYear != null) {
                currentUserDate = JSON.parse(currentUserDate);
                if (expiryMonth > 0 amp;amp; expiryYear > 0) {

                    //If the Expiry Year smaller than Current Year, then validation failed
                    if (expiryYear < currentUserDate.Year)
                    { args.IsValid = false; }
                    //If the Expiry Year larger than Current Year, then validation passed
                    else if (expiryYear > currentUserDate.Year)
                    { args.IsValid = true; }
                    //If the Expiry Year is same as Current Year, and if Expiry Month is smaller than current month, then validation failes, else passed.
                    else if (expiryYear == currentUserDate.Year) {
                        if (expiryMonth < currentUserDate.Month)
                            args.IsValid = false;
                        else
                            args.IsValid = true;
                    }
                }
                else
                { args.IsValid = true; }
            }