Сравнение дат внутри ServiceNow - PullRequest
0 голосов
/ 10 января 2019

При сравнении двух дат, как получить разницу между двумя объектами даты в ДНЯХ? (например - 2017-07-31 и 2017-07-28 -> это должно вернуть 3 дня).

Метка времени UNIX не будет работать, так как она не точна для моего случая - нет никакого способа узнать, должен ли я округляться до ближайших 24 часов (1 день).

getDay() функция не работает внутри приложения в пределах ServiceNow.

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Наиболее часто используемый API, доступный в Service Now для расчета продолжительности, - это gs.DateDiff (date1, date2), но он не работает в приложениях с областью действия.

SN предоставил свои собственные API-интерфейсы, которые могут извлекать длительность в приложении с использованием GlideDateTime API

Если ваши поля имеют дату / время

var date1 = new GlideDateTime("2011-08-28 09:00:00");
var date2 = new GlideDateTime("2011-08-31 08:00:00");
var diff = GlideDateTime.subtract(date1, date2);
gs.info(diff.getDisplayValue());

Если вам нужно указать его в каких-либо полях записи, укажите даты как

var date1 = new GlideDateTime(current.sys_created_on);
var date2 = new GlideDateTime(current.sys_updated_on);

Чтобы получить числовую разницу в секундах

gs.info(diff.getNumericValue());

Чтобы вычесть продолжительность только для полей даты

diff = GlideDate.subtract(date1, date2);
gs.info(diff.getDisplayValue());
0 голосов
/ 11 января 2019

Учитывая даты в формате ГГГГ-ММ-ДД, вы можете использовать конструктор Date, вычесть одно из другого и разделить на количество миллисекунд в одном дне.

Строки будут анализироваться как UTC, поэтому нет проблем с переходом на летнее время, и ECMAScript имеет ровно 8,64e7 мс в день. Даже если вам нужно округлить, летнее время не меняет значение более чем на 1 час (а в некоторых местах меньше), поэтому округление в порядке. Э.Г.

var d0 = '2017-07-31';
var d1 = '2017-07-28';
var diffDays = (new Date(d0) - new Date(d1)) / 8.64e7;

console.log(diffDays);

Обычно рекомендуется избегать встроенного синтаксического анализатора, однако в этом случае, скорее всего, все в порядке. Но для уверенности, проанализируйте строки вручную, библиотека может помочь, но для этого требуется только двухстрочная функция.

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

var d0 = new Date(2017, 6, 31, 23, 15, 45); // 2017-07-31T23:15:25 local
var d1 = new Date(2017, 6, 28, 3, 15, 45);  // 2017-07-28T03:15:25 local

function diffDays(d0, d1) {
  var a = new Date(d0).setHours(0,0,0,0);
  var b = new Date(d1).setHours(0,0,0,0);
  return Math.round((a - b) / 8.64e7);
}

console.log(diffDays(d0, d1));
...