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

count the number of days in a given date range in months, days using momentjs

本文关键字:计算 momentjs 使用 日期 为单位 范围内      更新时间:2023-09-26

如何从给定日期范围获得确切的天数?例:

today = moment("2016-06-29")
due = moment("2016-05-13")
days_left = today.diff(due, 'days'); // returns 47

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

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

var today = moment("2016-06-29");
var due = moment("2016-05-13");
var days_left = moment.preciseDiff(today, due); // '1 month 16 days'

一个普通的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};
}

方法接受两个格式为"YYYY-MM-DD"的日期字符串。返回的对象包含日历日期差异作为数值属性值,如果date1晚于date2,则later设为true。

*注:在需要借阅时,根据(我的)答案和(RobG)对较早错误日期差异问题的评论,在较早日期的月份中添加天数。

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

感谢您的所有输入,我能够得到的日子使用下面不是最佳的,但它的工作。我想知道是否有一个简单的答案

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天

这显然可以更好,但它的工作,我很高兴它现在基于@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`;
        }
    }
}

这是一个纯javascript解决方案

d1 = new Date("2016-06-29"); 
d2 = new Date("2016-05-13"); 
differ = new Date(
    d1.getFullYear() - d2.getFullYear(),
    d1.getMonth() - d2.getMonth(),
    d1.getDate() - d2.getDate()
);

然后,您可以从diff日期对象(如differ.getYear(), differ.getMonth()differ.getDate())中获得不同的年,月和日