使用momentjs计算给定日期范围内的天数(以月为单位)

时间:2016-06-29 03:15:10

标签: javascript date momentjs

如何获得指定日期范围内的确切天数? 恩。给出以下内容:

today = moment("2016-06-29")
due = moment("2016-05-13")

days_left = today.diff(due, 'days'); // returns 47

但我希望它显示1个月和16天?

5 个答案:

答案 0 :(得分:5)

您可以使用Moment.js Precise Range插件以人类可读的格式精确显示日期/时间范围。

var today = moment("2016-06-29");
var due = moment("2016-05-13");

var days_left = moment.preciseDiff(today, due); // '1 month 16 days'

答案 1 :(得分:0)

感谢您的所有输入,我能够让使用下面的日子不是最佳的,但它的工作原理。我想知道是否有一行答案,但

today = moment("2016-06-29")
due = moment("2016-05-13")
months_past_due = today.diff(due_date, 'months')
month_before_today = due_date.add(months_past_due, 'months')
days_past_due = today.diff(month_before_today, 'days')

alert(months_past_due + " "+ days_past_due)

一个问题,如果:

today = moment("2015-02-28");
due_date = moment("2015-01-30");

我应该将其视为逾期1个月或29天吗?上面的代码说它29天。

答案 2 :(得分:0)

简单的javascript方法:

function calendarDiff( date1, date2){
    var later = false;

    if( date1 > date2){
       later = true;
       var temp = date2;
       date2 = date1;
       date1 = temp;
    }
    date1 = date1.split("-");
    var y1 = date1[0], m1 = date1[1], d1 = date1[2];
    date2 = date2.split("-");
    var y2 = date2[0], m2 = date2[1], d2 = date2[2];

    if( (d2 -= d1) < 0){
        d2 += new Date(y1, m1, 0).getDate(); // *note
        ++m1;
    }
    if( (m2 -= m1) < 0){
        m2 += 12;
        ++y1;
    }
    y2 = y2 - y1;
    return {years: y2, months: m2, days: d2, later: later};
}

该方法采用格式为&#34; YYYY-MM-DD&#34;的两个日期字符串。返回的对象包含日历日期差异作为数字属性值,如果later晚于date1,则date2设置为true。

*注意:根据(我的)答案和(RobG)对早期wrong date difference问题的评论,在需要借用的较早日期的月份中添加天数。

实施例

var today = "2016-06-29";
var due = "2016-05-13";
JSON.stringify( calendarDiff( today, due) );
//= {"years":0,"months":1,"days":16,"later":true}

答案 3 :(得分:0)

这显然可以更好,但它可以工作,我现在对此感到满意 基于@ traktor53代码(谢谢!)

希望有人觉得这有用

function formatDate(date) {
    var later = false;
    const date1 = new Date();
    const date2 = new Date(date);
    let resultString = '';
    if (date1 < date2) {
        return 'Recently';
    }
    var y1 = date1.getFullYear(),
        m1 = date1.getMonth() + 1,
        d1 = date1.getDate();

    var y2 = date2.getFullYear(),
        m2 = date2.getMonth() + 1,
        d2 = date2.getDate();

    if (y1 - y2) {
        if (y1 - y2 == 1) {
            return `a year ago`;
        }
        return `${y1 - y2} years ago`;
    }

    if (m1 - m2) {
        if (m1 - m2 == 1) {
            return `a month ago`;
        }
        return `${m1 - m2} months ago`;
    }

    if (d1 - d2) {
        if (d1 - d2 > 7) {
            return `${Math.floor(d1 - d2 / 7)} weeks ago`;
        }
        if (d1 - d2 == 7) {
            return `a week ago`;
        }
        if (d1 - d2 < 7) {
            return `${d1 - d2} days ago`;
        }
    }
}

答案 4 :(得分:-1)

这是一个纯粹的JavaScript解决方案

differ.getYear()

然后,您可以从差异日期对象中获取差异年份,月份和日期,例如differ.getMonth()differ.getDate()compile 'com.google.code.gson:gson:2.7'