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

时间:2019-03-12 20:51:13

标签: javascript datediff servicenow

在我们的范围内的ServiceNow应用程序中,我们有一个要求来计算两个日期之间的年,月和天的数量。以下我们的业务规则运作良好,但并非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天之间(包括leap年)。在不使用诸如moment.js之类的库的情况下,关于以上代码的任何建议都可以更加准确?

谢谢!

2 个答案:

答案 0 :(得分:0)

使用this answer作为参考。

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

有了该数字后,您就可以在工作日计数中添加那么多天了。

// ... 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);
}

希望这会为您指明正确的方向。

答案 1 :(得分:0)

月份和年份只需使用gdt.getMonth()和gdt.getYear()计算,如果相隔数年,则相加12个月。

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

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

据我所知,日子应该是正确的。您也可以Difference in Months between two dates in JavaScript

检查该线程