我不是在寻找标题中的问题的答案或代码段,而是我正在寻找帮助,理解为什么代码片段不像我期望的那样工作:
var getMonthsBetween = function(date1, date2)
{
'use strict';
// Months will be calculated between start and end dates.
// Make sure start date is less than end date.
// But remember if the difference should be negative.
var start_date = date1;
var end_date = date2;
var inverse = false;
if (date1 > date2)
{
start_date = date2;
end_date = date1;
inverse = true;
}
// Calculate the differences between the start and end dates
var yearsDifference = end_date.getFullYear() - start_date.getFullYear();
var monthsDifference = end_date.getMonth() - start_date.getMonth();
var daysDifference = (end_date.getDate()+1) - start_date.getDate(); // This +1 might be a mistake
return (inverse ? -1 : 1) * (yearsDifference * 12 + monthsDifference + daysDifference/30); // Add fractional month
}
上述代码旨在返回2个给定日期之间的差异(以月为单位),精确到第一个小数点。我自己没有编写代码而且没有与任何人编写代码,遗憾的是,我无法分辨为什么作者决定在结束日期时添加一天到达结束日期(有稍微偏离的情况。)
有人可以帮我解决这个问题吗?我不确定是什么原因在这里增加额外的一天((end_date.getDate()+1)
)而且我不确定它是否正确(我怀疑它不正确)但我想要另一种意见。
修改 我不清楚 函数如何按预期工作 - 只要用户从2个日期选择器中选择2个日期就会调用它。计算出的数字不会发送到后端,而是发回原来的2个日期,然后我们使用(PHP)datetime.diff计算出日期之间有多少个月。后端已被确认为正确,但前端并不总是与之匹配,例如
start date = Monday June 30, 2014, 00:00:00
end date = Saturday February 28, 2015, 00:00:00
result (JS) = 7.933333333333334
result (PHP datetime.diff) = 8.0333333333333
或
start date = Tuesday June 30, 2015, 00:00:00
end date = Monday February 29, 2016, 00:00:00
result (JS) = 7.966666666666667
result (PHP datetime.diff) = 8.0333333333333
当数字做匹配时,其他次,例如。
start date = Monday June 30, 2014, 00:00:00
end date = Wednesday April 15, 2015, 00:00:00
result (JS) = 9.5
result (PHP datetime.diff) = 9.5
答案 0 :(得分:2)
您认为这是错误的,因为您认为这两个日期都是00:00:00
。原作者的思维方式不同:第一个日期假定为00:00:00
,最后一个日期假定为24:00:00
。 (当然,JavaScript没有24:00:00
)的概念。
所以,基本上你们两个都是对的,原作者应该对此发表评论。
其他看待这个问题的角度来自一些数论:你认为函数计算为左闭 - 右开启区间,原作者想到已关闭间隔
答案 1 :(得分:2)
显然,PHP的datetime.diff包含计算中的结束日期。当我实际上在JavaScript端增加结束日期时,数字都匹配。在比较它们之前增加日期对象本身会改变到下个月。最初的开发人员注意到这种情况正在发生,但他没有正确地增加结束日期。他又在结束日期的日期值中添加了一天,但是在2015年2月28日添加一天后,这个数字没有变化到下个月
此代码按预期工作:
var getMonthsBetween = function(date1, date2)
{
'use strict';
// Months will be calculated between start and end dates.
// Make sure start date is less than end date.
// But remember if the difference should be negative.
var start_date = date1;
var end_date = date2;
var inverse = false;
if (date1 > date2)
{
start_date = date2;
end_date = date1;
inverse = true;
}
end_date = new Date(end_date); //If you don't do this, the original date passed will be changed. Dates are mutable objects.
end_date.setDate(end_date.getDate() + 1);
// Calculate the differences between the start and end dates
var yearsDifference = end_date.getFullYear() - start_date.getFullYear();
var monthsDifference = end_date.getMonth() - start_date.getMonth();
var daysDifference = end_date.getDate() - start_date.getDate();
return (inverse ? -1 : 1) * (yearsDifference * 12 + monthsDifference + daysDifference/30); // Add fractional month
}