当前位置: 首页 > 知识库问答 >
问题:

在JavaScript中计算年,月和天的时间跨度

管弘
2023-03-14

我想计算两个日期之间的时间跨度(注意:输入格式为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 lib。Moments.js,似乎没有任何方法。

因此,我开始创建自己的代码,但总有几天(2-3天)没有达到预期的结果。老实说,如果我看我的代码,我会觉得它很烂,必须有一种更智能、更优雅的方法来计算它(在我的示例中,我将它输出到一个span):

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/

有什么办法解决这个问题吗?

共有2个答案

范金鑫
2023-03-14

我已经用瞬间达到了你需要的结果

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");

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

陶胤
2023-03-14

我希望这将有助于:

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

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

 类似资料:
  • 我正在开发一个程序,它采用开始日期和结束日期,并返回年、月和日的不同值。每个类别都有自己的代码部分,这是我一直在使用的代码,到目前为止,它一直是半精确的,直到几天(有时是几个月。我甚至不想在这一点上愚弄闰年) Ex Start:04/10/2000 End:04/10/2006应该给我6年零个月零天。 年份代码: 月份代码: 天数代码:我已经尝试了多个版本,但没有太大的成功,例如,我可以计算天数之

  • 这是我的代码,从这里采取:计算年龄在JavaScript 它如何继续与月和日,如: 用户生日是:2010/04/29 结果应该是这样的:2岁4个月5天。 演示:http://jsfiddle.net/jFxb5/

  • 问题内容: 如何使用javascript从1-366计算一年中的某一天?例如: 1月3日 应该是 3 月3 日 。 2月1日 应该是 32 。 问题答案: 在OP的编辑之后: 编辑:上面的代码会失败时,是3月26日和10月29日之间的日期的时间是凌晨1点之前(如零时59分59秒)。这是因为该代码未考虑夏令时。

  • 问题内容: 如果您提供的在你上一个月的最后一天: 在mozilla上有对此行为的引用。这是可靠的跨浏览器功能还是我应该考虑替代方法? 问题答案: var month = 0; // January var d = new Date(2008, month + 1, 0); alert(d); // last day in January 输出差异是由于实现方式的差异,而不是日期不同。 当然,仅因为

  • 我试图在我正在创建的C#应用程序中显示两个日期之间的年、月和日。(使用控制台进行测试) 我正在使用NodaTime来实现这一点,但在接下来的几个月里,我遇到了一些问题。 我已经阅读了这里的大部分问题和答案,但没有找到任何我可以从中受益的东西。 大多数时候函数工作但有时它不添加月如果天 我使用这个代码进行测试 (2017, 10, 16)和(2018, 1, 15)应该显示为3个月,但它们显示为2个