2016-04-19 10 views
0

JavaScriptを使用して2つの日付を差し引いています。日付の値はフォームフィールドから来ます。フォームのWordPressサイトでFormidable Proを使用しています。Javascriptを使用してフォームエントリから2つの日付を差し引く

このフォームは、企業が税金を支払うためのものです。税金は毎月20日に支払われます。時にはビジネスが遅れて税金を支払うこともあるので、フォームの冒頭で税金を払っている月を指定します。

最初の日付は現在の日付です。 mm/dd/yyyyの形式でFormidableショートコードを使用してフォームフィールドに入力されます。

2番目の日付は、年と月のエントリから計算されます。これらの値は「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"は差分フィールドのキーです。

UPDATE 2016年4月19日

あなたの助けありがとうございました。あなたが言うことができない場合、私は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> 
+0

あなたは見つけるためにあなたのコードをデバッグしようとしていますすべての変数の値が期待どおりであれば? – Ramin

+0

質問を問題のコードだけにすると、はるかに簡単になります。だから、すべてのjQueryを取り除き、いくつかのテスト値と期待される出力で関数をポストするだけです。 – RobG

答えて

0

あなたは人生を作っていますそれよりも難しいです。 m/d/y形式の日付文字列を解析するには、以下のような簡単な関数を使用します。

<または>を使用して日付を比較する場合は、比較することができます。しかし、関係比較演算子が日付を数値として比較しても、=====演算子はそうではないので、時間値を明示的に比較することがより明確になります。

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); 
0

実際の書式設定された日付ではなく、タイムスタンプをmsで使用することができます。 JSを使用して、あなたがこのようにそれを行うことができます。タイムスタンプにあなたの2つの日付を変換する

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 

はあなたが別のものをsubstractして、バック形式の日付に変換することができます:

var date = new Date(ts*1000); 
var d = date.getDate(); 
var m = date.getMonth() + 1; 
var y = date.getFullYear(); 
var formatted = d + '/' + m + '/' + y; 
+0

あなたは '...(myDate [0] - 1)... 'が必要です。または、日付は1か月になります(ゼロベースです)。 ;-) – RobG

+0

admixと@RobGの両方に感謝します。 –

関連する問題