繁体   English   中英

用JavaScript计算年,月和日的时间跨度

[英]Calculating timespan in years, months and days in JavaScript

我想计算两个日期之间的时间跨度(注意:输入格式为dd.MM.yyyy,请参见下面的代码)。 特殊的是,不想每月使用30天,一年不想使用360天。 我宁愿想要“人类格式”的差异(不知道如何称呼它)。

假设我要计算从2014年10月1日到2015年3月17日之间的差异(包括最后一天)。从10月到2月,这需要5个月的时间。 然后剩下的时间将是18天(从第1天到第17天,包括第17天)。 因此结果应为:

0年5个月18天

这种计算当然会忽略某些月份的31、30、28或29天(日期计算除外,当日期采用以下格式时:开始日期:2014年10月17日;结束日期:2015年1月12日) 。

不幸的是,我没有找到任何已经实现这种计算的JS库。 Moments.js,似乎没有任何方法。

因此,我开始创建自己的代码,但是仍然离预期的结果还有几天(2-3天)。 老实说,如果我看我的代码,我感觉它很烂,并且必须有一种更智能,更优雅的方式来计算它(在我的示例中,我将其输出到一个跨度):

function getTimeDifferenceContract(startDateStr, endDateStr) {
    var returnObject = { "years": null, "months": null, "days": null };
    var startDateArray = startDateStr.split('.');
    var endDateArray = endDateStr.split('.');
    var startMonthIx = startDateArray[1]-1;
    var endMonthIx = endDateArray[1]-1;
    var startDate = new Date(startDateArray[2], startMonthIx, startDateArray[0]);
    var endDate = new Date(endDateArray[2], endMonthIx, endDateArray[0]);

    var endDateFixed = new Date(endDate.getTime()+(1*24*60*60*1000));

    if (endDate > startDate) {
        var years = 0;
        var months = 0;
        var days = 0;
        var dateDiff = endDateFixed.getTime() - startDate.getTime();

        var sD = startDate.getDate();
        var sM = startDate.getMonth()+1;
        var sY = startDate.getFullYear();

        var eD = endDateFixed.getDate();
        var eM = endDateFixed.getMonth()+1;
        var eY = endDateFixed.getFullYear();

        if (sY == eY && sM == eM) {         
            days = Math.floor(dateDiff / (1000 * 60 * 60 * 24));
        }
        else if (sY == eY) {
            if (sD > eD) {
                months = eM - sM - 1;
                var startMonthRestDays = getMonthdays(sM, sY) - sD;
                days = startMonthRestDays + eD;
            }
            else {
                months = eM - sM;
                days = eD - sD;
            }
        }
        else {
            years = eY - sY - 1;
            var monthForYears = 0;
            if (years > 0) {
                monthForYears = (years - 1) * 12;
            } else {
                monthForYears = years * 12;
            }
            months = (12 - sM) + (eM - 1) + (monthForYears)
            var startMonthRestDays = getMonthdays(sM, sY) - sD;
            days = startMonthRestDays + eD - 0;
        }

        var lastMonth = eM - 1;
        var yearForEndMonthDays = eY;
        if (lastMonth < 1) {
            lastMonth = 12;
            yearForEndMonthDays = eY - 1;
        }       
        var endMonthDays = getMonthdays(lastMonth, yearForEndMonthDays);
        if (days >= endMonthDays) {          
            months = months + 1;
            days = days - endMonthDays - 1;
        }
        if (months >= 12) {
            years = years + 1;
            months = months - 12;
        }

        returnObject.years = years;
        returnObject.months = months;
        returnObject.days = days;
    }
    return returnObject;
}

function main() {   
    var difference = getTimeDifferenceContract("30.09.2014", "01.10.2015");
    var years = difference.years;
    var months = difference.months;
    var days = difference.days;

    jQuery('#myText').text(years + " years, " + months + " months, " + days + " days");
}

main();

小提琴: http : //jsfiddle.net/4ddL27gx/2/

有什么解决办法吗?

我已经花了一点时间来达到您需要的结果

var moment1 = new moment(new Date("30/Sep/2014"));
var moment2 = new moment(new Date("01/Oct/2015"));

var diffInMilliSeconds = moment2.diff(moment1);

var duration = moment.duration(diffInMilliSeconds);

var years = duration.years();
var months = duration.months();
var days = duration.days();

$('.div1').text(moment1.format());
$('.div2').text(moment2.format());
$('.div3').text(years + " years, " + months + " months, " + days + " days");

jsfiddle http://jsfiddle.net/mfarouk/qLqm3uuh/1/

我希望这个能帮上忙:

在JavaScript中获取年,月,日中的两个日期之间的差

我有同样的必要性,但没有答案,所以我写了一个似乎起作用的函数...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM