[英]Using Javascript to subtract two dates given from form entries
我正在尝试使用JavaScript减去两个日期。 日期值来自表单字段。 我正在WordPress网站上使用Formidable Pro进行表单。
该表格是一种允许企业纳税的表格。 税款于每个月20日到期。 有时企业可能会延迟缴纳税款,因此在表格的开头,他们会指定要缴纳税款的月份。
第一个日期是当前日期。 使用格式为mm / dd / yyyy的强大短代码将其填充到表单字段中。
第二个日期是根据“年”和“月”的条目计算得出的。 然后将这些值与“ 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”是差异领域的关键。
更新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>
您可以尝试使用以毫秒为单位的时间戳,而不是实际的格式化日期。 使用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
将您的2个日期转换为时间戳,将使您可以从另一个日期中减去一个日期,然后将其转换回格式化日期:
var date = new Date(ts*1000);
var d = date.getDate();
var m = date.getMonth() + 1;
var y = date.getFullYear();
var formatted = d + '/' + m + '/' + y;
您使生活变得更加艰难。 要解析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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.