使用 Javascript 从表单条目中减去给定的两个日期
Using Javascript to subtract two dates given from form entries
我正在尝试使用 javascript 来减去两个日期。日期值来自表单字段。我在 WordPress 网站上使用 Formidable Pro 来制作表格。
该表格是一种允许企业纳税的表格。税款在每个月的 20 日到期。有时企业可能会延迟纳税,因此在表格的开头,他们会指定他们纳税的月份。
第一个日期是当前日期。它使用 mm/dd/yyyy.
格式的 Formidable 短代码填充到表单字段中
第二个日期是根据年和月的条目计算得出的。然后将这些值与“20”连接起来,形成他们纳税月份的 20 号的完整日期值。
如果他们在 20 日或之前纳税,则不会受到处罚。如果在 20 号之后,就会受到惩罚。我想减去日期,然后根据大于零的差异来确定付款是否延迟——并将该差异值填充到表单字段中。
这是我一直在使用的代码。您会看到我在哪里注释掉了一种计算差值并将差值返回到表单中的方法。
使用下面的代码,脚本 returns 在差异字段中出现 "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"是用户给定的billing period的year值域
"o1ns5"是用户给的billing period字段的月份值字段
"tm25b" 是串联的截止日期:上面字段中给出的月份的 20 号。
"smmyr"是差异字段的key。
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())
);
如果您想与 "today" 进行比较,请不要忘记将小时数设置为零:
var today = new Date();
today.setHours(0,0,0,0);
我正在尝试使用 javascript 来减去两个日期。日期值来自表单字段。我在 WordPress 网站上使用 Formidable Pro 来制作表格。
该表格是一种允许企业纳税的表格。税款在每个月的 20 日到期。有时企业可能会延迟纳税,因此在表格的开头,他们会指定他们纳税的月份。
第一个日期是当前日期。它使用 mm/dd/yyyy.
格式的 Formidable 短代码填充到表单字段中第二个日期是根据年和月的条目计算得出的。然后将这些值与“20”连接起来,形成他们纳税月份的 20 号的完整日期值。
如果他们在 20 日或之前纳税,则不会受到处罚。如果在 20 号之后,就会受到惩罚。我想减去日期,然后根据大于零的差异来确定付款是否延迟——并将该差异值填充到表单字段中。
这是我一直在使用的代码。您会看到我在哪里注释掉了一种计算差值并将差值返回到表单中的方法。
使用下面的代码,脚本 returns 在差异字段中出现 "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"是用户给定的billing period的year值域
"o1ns5"是用户给的billing period字段的月份值字段
"tm25b" 是串联的截止日期:上面字段中给出的月份的 20 号。
"smmyr"是差异字段的key。
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())
);
如果您想与 "today" 进行比较,请不要忘记将小时数设置为零:
var today = new Date();
today.setHours(0,0,0,0);