ServiceNow:计算年,月,日的日期差异不准确

问题描述 投票:0回答:2

我们在作用域ServiceNow应用程序中要求计算2个日期之间的年,月和日数。我们的业务规则下面的工作正常,但并非100%完美:

    (function executeRule(current, previous /*null when async*/) {

    var t = new GlideDateTime(current.from.getDisplayValue());
    var f = new GlideDateTime(current.to.getDisplayValue());

    var duration = GlideDateTime.subtract(t, f).getDayPart();

    var durationYears = Math.floor(duration/365);
    var durationMonths = Math.floor((duration % 365)/30);
    var durationDays = Math.floor((duration % 365)%30);

    current.setValue('year', durationYears);
    current.setValue('month', durationMonths);
    current.setValue('day', durationDays);


})(current, previous);

如果假设每个月有30天,这可以正常工作。但是,月份长度显然可以在29-31天之间(包括闰年)。如果不使用诸如moment.js之类的库,对上述代码的任何建议都可以更准确?

谢谢!

javascript datediff servicenow
2个回答
0
投票

使用this answer作为参考。

基本上它计算每个日期年份值之前的闰年数,然后从较晚的日期中减去较早日期的结果。

获得该号码后,您可以将这些天数添加到您的日期。

// ... the rest of your code

var durationDays = Math.floor((duration % 365)%30) + LeapYearsBetween(fromYearValue, toYearValue);

function LeapYearsBetween(start, end)
{
    return LeapYearsBefore(end) - LeapYearsBefore(start + 1);
}

function LeapYearsBefore(year)
{
    year -= 1;
    return (year / 4) - (year / 100) + (year / 400);
}

希望这能指出你正确的方向。


0
投票

对于月份和年份,只需使用gdt.getMonth()和gdt.getYear()进行计算,并添加12个月,如果它们相隔数年。

年:gdt1.getYear() - gdt2.getYear()

几个月gdt1.getMonth() - gdt2.getMonth() + yearDifference*12

就我所见,天应该是正确的。你也可以检查这个线程Difference in Months between two dates in JavaScript

© www.soinside.com 2019 - 2024. All rights reserved.