获得两个日期之间的月份

时间:2015-09-22 08:40:25

标签: javascript jquery date datejs

我不是在寻找标题中的问题的答案或代码段,而是我正在寻找帮助,理解为什么代码片段不像我期望的那样工作:

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

2 个答案:

答案 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
}