ServiceNow: расчет даты различий в годах, месяцах, днях не точен - PullRequest
0 голосов
/ 12 марта 2019

В нашем приложении 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 дня (включая високосные годы).Любые предложения по приведенному выше коду могут быть более точными без использования библиотек, таких как moment.js?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

для месяца и года просто рассчитайте с помощью gdt.getMonth () и gdt.getYear () и добавьте 12 месяцев, если они разделены годами.

года: gdt1.getYear() - gdt2.getYear()

Месяцы gdt1.getMonth() - gdt2.getMonth() + yearDifference*12

Дни должны быть правильными, насколько я вижу.Вы также можете проверить эту тему Разница в месяцах между двумя датами в JavaScript

0 голосов
/ 13 марта 2019

Используя этот ответ в качестве ссылки.

По сути, он вычисляет количество високосных лет до значения года каждой даты, а затем вычитает результат более ранней даты из более поздней.

Если у вас есть этот номер, вы можете добавить столько дней к вашему счету.

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

Надеюсь, это направит вас в правильном направлении.

...