【问题标题】:Javascript month differenceJavascript 月差
【发布时间】:2010-11-30 10:45:27
【问题描述】:

如何在 Javascript 中计算月差?

请注意有类似的问题,例如: What's the best way to calculate date difference in Javascript

但这些是基于 MS 差异,当某些月份的天数与其他月份不同时!

有什么简单的方法可以计算两个日期之间的月差吗?

为了清楚起见,我需要知道日期跨越多少个月,例如:

Jan 29th 2010, and Feb 1st 2010 = 2 months
Jan 1st 2010, and Jan 2nd 2010 = 1 month
Feb 14th 2010, Feb 1st 2011 = 13 months
Feb 1st 2010, March 30th 2011 = 14 months

【问题讨论】:

  • 月差到底是什么意思?整个日历月,例如 12Apr2010 -> 16Jun2010 = 1 ;或从开始日期开始的月份长度,例如 12Apr2010 -> 16Jun2010 = 2。或者您是否也想计算小数部分?在这种情况下。每天获得什么价值? 2 月的一个月是 1/28,而 12 月的一个月是 1/31?然后是闰年......
  • 抱歉,要明确的是日期范围跨越的总 # 个月。

标签: javascript date


【解决方案1】:
DisplayTo.getMonth() - DisplayFrom.getMonth() + (12 * (DisplayTo.getFullYear() - DisplayFrom.getFullYear())));

getMonth 减去 getMonth 得出两个月日期之间的月差。

然后,我们将 12 乘以年数差异,并将其添加到结果中,得到完整的月份跨度。

【讨论】:

  • 不错的一个班轮.. 如果有人感兴趣,可以在这里找到测试用例。 jsfiddle.net/E5Bz3/1 :)
  • 例如,如果 StartDate = 2012 年 12 月 12 日和 EndDate = 2013 年 1 月 1 日,则不起作用。结果将是 1,而不是 2。
【解决方案2】:

[edit] 根据评论,我已更正。使用接受的答案,我会使用类似的东西:

var  datefrom = new Date('2001/03/15')
    ,dateto = new Date('2011/07/21')
    ,nocando = datefrom<dateto ? null : 'datefrom > dateto!'
    ,diffM = nocando || 
             dateto.getMonth() - datefrom.getMonth() 
              + (12 * (dateto.getFullYear() - datefrom.getFullYear()))
    ,diffY = nocando || Math.floor(diffM/12)
    ,diffD = dateto.getDate()-datefrom.getDate()
    ,diffYM = nocando || 
               (diffY>0 ? ' Year(s) ' : '')
               + diffM%12+' Month(s) '+(diffD>0? (diffD+' day(s)') : '') ;

 console.log(diffYM); //=> 10 Year(s) 4 Month(s) 6 day(s)

【讨论】:

  • 如果两个日期是:date1 = new Date('2011/1/04') ,date2 = new Date('2010/12/04') 这是错误的,它会给出错误的答案
  • 你说得对,最好使用 Gullens oneliner。基于此编辑的答案。
【解决方案3】:

我在网站http://ditio.net/2010/05/02/javascript-date-difference-calculation/上找到了以下内容:

inMonths: function(d1, d2) {
        var d1Y = d1.getFullYear();
        var d2Y = d2.getFullYear();
        var d1M = d1.getMonth();
        var d2M = d2.getMonth();

        return (d2M+12*d2Y)-(d1M+12*d1Y);
    }

在您的情况下,由于您想在日期范围内包含所有月份,我只需修改上面的代码,将其添加 1:return (d2M+12*d2Y)-(d1M+12*d1Y) + 1;

【讨论】:

    【解决方案4】:
    function calcualteMonthYr(){
        var fromDate =new Date($('#txtDurationFrom2').val()); // Date picker (text fields)
        var toDate = new Date($('#txtDurationTo2').val());
        var months=0;
            months = (toDate.getFullYear() - fromDate.getFullYear()) * 12;
            months -= fromDate.getMonth();
            months += toDate.getMonth();
                if (toDate.getDate() < fromDate.getDate()){
                    months--;
                }
        $('#txtTimePeriod2').val(months); // result
    }
    

    【讨论】:

    • 或许能详细说明一下你的答案
    猜你喜欢
    • 2014-01-15
    • 1970-01-01
    • 2021-08-30
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多