Использование Javascript для вычитания двух дат из записей формы

Я пытаюсь использовать javascript для вычитания двух дат. Значения даты берутся из полей формы. Я использую Formidable Pro на сайте WordPress для формы.

Форма позволяет бизнесу платить налоги. Налог уплачивается 20-го числа каждого месяца. Иногда бизнес может платить налоги с опозданием, поэтому в начале формы они указывают, за какой месяц они платят налоги.

Первая дата – это текущая дата. Он заполняется в поле формы с помощью короткого кода Formidable в формате мм/дд/гггг.

Вторая дата рассчитывается из записей для года и месяца. Затем эти значения объединяются с «20», чтобы сформировать полное значение даты для 20-го числа месяца, за который они платят налоги.

Если они платят налоги 20 числа или ранее, штрафа нет. Если это после 20-го, есть штраф. Я хочу вычесть даты, а затем определить, задерживается ли платеж, основываясь на том, что разница больше нуля, и это значение разницы заполняется в поле формы.

Это код, который я использовал. Вы увидите, где я закомментировал один метод вычисления и возврата значения разницы в форму.

В приведенном ниже коде сценарий возвращает ошибку «NaN» в поле разницы.

Почему? Как исправить ошибку и сообщить о разнице? Все, что мне нужно знать, это отрицательное или >= ноль.

<script type="text/javascript">
jQuery(document).ready(function($){
$('#field_21nfg, #field_o1ns5').change(function(){
  var Year = $("#field_21nfg").val();
  var Month = $("#field_o1ns5").val();

  $("#field_tm25b").val(Month+'/'+'20'+'/'+Year);

// var Due = $("#field_tm25b5").val();
// var Today = $("#field_1pjvu").val();
//
// var dDue = new Date('Due');
// var dToday = new Date('Today');
// var diff = Math.floor(dDue - dToday);

// $("#field_smmyr").val(diff);

var oneDay = 24*60*60*1000;

var Today_str = $("#field_1pjvu").val(); // E.g., "mm/dd/yyyy";
var Today_dt = new Date(parseInt(Today_str.substring(6), 10),        // Year
                  parseInt(Today_str.substring(0, 2), 10) - 1, // Month (0-11)
                  parseInt(Today_str.substring(3, 5), 10));    // Day

var Due_str = $("#field_tm25b5").val(); // E.g., "mm/dd/yyyy";
var Due_dt = new Date(parseInt(Due_str.substring(6), 10),        // Year
                  parseInt(Due_str.substring(0, 2), 10) - 1, // Month (0-11)
                  parseInt(Due_str.substring(3, 5), 10));    // Day

//var diff = Math.floor(Due_dt-Today_dt);
var diffDays = Math.round(Math.abs((Today_dt.getTime() - Due_dt.getTime())/(oneDay)));

$("#field_smmyr").val(diffDays);

 });
});
</script>

"1pjvu" - ключ поля сегодняшней даты

«21nfg» — это поле значения года расчетного периода, заданное пользователем.

«o1ns5» — это поле значения месяца в поле расчетного периода, заданное пользователем.

«tm25b» — объединенная дата выполнения: 20-е число месяца, указанного в поле выше.

"smmyr" - это ключ поля различия.

ОБНОВЛЕНИЕ 19 апреля 2016 г.

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

<script type="text/javascript">
jQuery(document).ready(function($){
$('#field_21nfg, #field_o1ns5').change(function(){

  var Year = $("#field_21nfg").val(); //Collect value from Filing Period Year form field
  var Month = $("#field_o1ns5").val();//Collect value from Filing Period Month form field
  var Day = 20; //Due date for filing tax return
  var DueDate = Month+'/'+Day+'/'+Year;
  $("#field_tm25b").val(DueDate); //Populate "Due Date" form field with due date generated above

function parseMDY(s) {
  var b = s.split(/\D/);
  return new Date(b[2], b[0]-1, b[1]);
}

var Today = $("#field_1pjvu").val(); //Collect Value from Today's Date form field

if (DueDate > Today) {
$("#field_smmyr").val(1); //Returns true/1 for on or before due date
} else {
$("#field_smmyr").val(0); //Returns false/0 for after due date
}
 });
});
</script>

person Casey H    schedule 19.04.2016    source источник
comment
Вы пытались отладить свой код, чтобы узнать, все ли ваши переменные имеют правильное значение, как и ожидалось?   -  person Ramin    schedule 19.04.2016
comment
Было бы намного проще, если бы вы сократили свой вопрос до рассматриваемого кода. Поэтому удалите весь jQuery и просто опубликуйте функцию с некоторыми тестовыми значениями и ожидаемым результатом.   -  person RobG    schedule 19.04.2016


Ответы (2)


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

Если вы хотите сравнить даты, используя < или > как целые дни, вы можете просто сравнить их. Но хотя операторы реляционного сравнения сравнивают даты как числа, операторы == и === этого не делают, поэтому понятнее явно сравнивать значения времени.

function parseMDY(s) {
  var b = s.split(/\D/);
  return new Date(b[2], b[0]-1, b[1]);
}

var a = '2/29/2016';
var b = '12/31/2015';

document.write(parseMDY(a) + '<br>' + parseMDY(b) + '<br>');


document.write('Is ' + a + ' before ' + b + '? ' +
              (parseMDY(a).getTime() < parseMDY(b).getTime())
);

И если вы хотите сравнить с «сегодня», не забудьте установить часы на ноль:

var today = new Date();
today.setHours(0,0,0,0);
person RobG    schedule 19.04.2016

Вы можете попробовать использовать метки времени в мс вместо фактически отформатированных дат. Используя JS, вы можете сделать это следующим образом:

var myDate="18/04/2016";
myDate=myDate.split("/");
var newDate=myDate[1]+"/"+myDate[0]+"/"+myDate[2];
var ts = new Date(newDate).getTime();  //timestamp in milliseconds

Преобразование ваших двух дат в временные метки позволит вам вычесть одну из другой, а затем преобразовать ее обратно в отформатированную дату:

var date = new Date(ts*1000);
var d = date.getDate();
var m = date.getMonth() + 1;
var y = date.getFullYear();
var formatted = d + '/' + m + '/' + y;
person admix    schedule 19.04.2016
comment
Вам нужно ... (myDate[0] - 1) ... , иначе дата будет через месяц (они отсчитываются от нуля). ;-) - person RobG; 19.04.2016
comment
Спасибо и admix, и @RobG. - person Casey H; 19.04.2016