jQuery Проверить выбранное время не в прошлом и не менее чем за 30 до текущего времени с помощью JavaScript

Как я могу проверить правильность выбранного времени, если пользователю предоставляется список временных рамок для выбора, я хотел бы проверить выбранную временную рамку со следующими критериями:

1) не в прошлом (другими словами, не раньше)
2) выбранное время должно быть как минимум на 30 минут больше текущего времени

Here is the HTML snippet from my form:
<select id="callBackTime" tabindex="9" name="callBackTime">
<option value="8:00 AM - 8:30 AM">8:00 AM - 8:30 AM</option>
<option value="8:30 AM - 9:00 AM">8:30 AM - 9:00 AM</option>
<option value="9:00 AM - 9:30 AM">9:00 AM - 9:30 AM</option>
<option value="9:30 AM - 10:00 AM">9:30 AM - 10:00 AM</option>
<option value="10:00 AM - 10:30 AM">10:00 AM - 10:30 AM</option>
</select>

Я использую jQuery.validator.addMethod(), чтобы добавить свое собственное правило, и это то, что у меня есть до сих пор:

Here is my JQuery Custom rule Validation so far:
$.validator.addMethod (
  "timeToCall", 
    function(value, element) {
    var timeSelected = $('#callBackTime').val();
    var today = new Date();
    var currentTime = today.getHours() + ':' + today.getMinutes();
    return Date.parse(timeSelected) > Date.parse(currentTime);
  }, 
  "*Please select a later time."
);

Here is the code to trigger the validation:
  $('#submit').click(function(e) {
     $("#supportCallBackForm").validate({

      rules: { 
      callBackTime: { timeToCall : true }
      },

     submitHandler: function(form) {
     // do other things for a valid form
     submitCallBackSupportRequest();
     return false;
    }
   });
});

Я думаю, что мой собственный метод .validator — это то, где мне больше всего нужна помощь. Я не знаю, как правильно сравнить то, что выбирает пользователь, и текущее время, кроме того, выбранное время должно быть не менее 30 минут от СЕЙЧАС. Любая помощь очень ценится.


person friedbeings    schedule 03.12.2013    source источник


Ответы (2)


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

<select id="callBackTime" tabindex="9" name="callBackTime">
    <option value="20:00 - 20:30">8:00 PM - 8:30 PM</option>
    <option value="20:30 - 21:00">8:30 PM - 9:00 PM</option>
    ....
    ....
    <option value="08:30 - 09:00">8:30 AM - 9:00 AM</option>
</select>

обратите внимание, конечно, на две цифры, обозначающие однозначные часы.

Это значительно облегчит разбор.

В вашем валидаторе вы можете сделать так

$.validator.addMethod (
  "timeToCall", 
    function(value, element) {
    var now = new date();
    var timeSelected = $('#callBackTime').val();
    var startHour = timeSelected.substr(0,2);
    var startMin = timeSelected.substr(3,2);
    var endHour = timeSelected.substr(9,2);
    var endMin = timeSelected.substr(12,2);
    // depending on whether you are interested in the beginning of the timespan or the end
    var startTimeInMinutes = (startHour * 60) + startMin;
    var targetTimeInMinutes = (now.getHours() * 60) + now.getMinutes();
    return startTimeInMinutes + 30 > targetTimeInMinutes;
 }, 
  "*Please select a later time."
);

На самом деле я не запускал этот код, поэтому я определенно проверял бы полученные подстроки, нужно ли вам анализировать строки перед их умножением и выполняется ли * до +

Мне как-то похуй на эти вещи.

удачи и дайте мне знать, если вам нужно больше.

person Raif    schedule 04.12.2013

Взгляните на moment.js. Вы можете получить текущее время плюс 30 минут следующим образом:

var smallestAllowedTime = moment().add("m",30);

Затем, если пользователь выбрал 8:30 - 9:00, если вы проанализируете 8 и 30 как «пол», «час и минуту» для времени вызова, вы можете довольно легко провести сравнение:

var hour = 8; // parsed from selection
var minute = 30; // parsed from selection
var userSelectedTime = moment().set("hour",hour).set("minute",minute);
return userSelectedTime.isAfter(smallestAllowedTime);

Это еще не учитывает am/pm или часовые пояса.

person PaulProgrammer    schedule 03.12.2013