ServiceNow 中的日期比较
Date comparison inside ServiceNow
比较两个日期时,如何获取两个日期对象之间的天数之差? (例如 - 2017-07-31 和 2017-07-28 --> 这应该 return 3 天)。
UNIX 时间戳将不起作用,因为它对我的情况不准确 - 无法知道我是否应该四舍五入到最近的 24 小时(1 天)。
getDay()
函数在 ServiceNow 内的作用域应用程序内部不起作用。
给定格式为 YYYY-MM-DD 的日期,您可以使用 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);
通常建议避免使用内置解析器,但在这种情况下可能没问题。但是为了自信,手动解析字符串,一个库可以提供帮助,但它只需要一个 2 行函数。
如果您的日期不是按上述方式创建的并且未设置为午夜,您可以通过将日期设置为午夜、减去和四舍五入来获得日期之间的天数,例如
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));
Service Now 中最常用的 API 可用于计算持续时间的是 gs.DateDiff(date1, date2),但它在范围应用程序中不起作用。
SN 提供了它自己的 APIs,它可以使用 GlideDateTime API
在范围应用程序中获取持续时间
如果您的字段是 date/time
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());
如果您想在业务规则中执行此操作,在作用域应用程序中,它可能如下所示(已测试在奥兰多版本中):
(function executeRule(current, previous /*null when async*/) {
var field_1 = new GlideDateTime(current.field_1);
var field_2 = new GlideDateTime(current.field_2);
current.field_duration = new GlideDuration(field_1.getNumericValue() - field_2.getNumericValue());
})(current, previous);
比较两个日期时,如何获取两个日期对象之间的天数之差? (例如 - 2017-07-31 和 2017-07-28 --> 这应该 return 3 天)。
UNIX 时间戳将不起作用,因为它对我的情况不准确 - 无法知道我是否应该四舍五入到最近的 24 小时(1 天)。
getDay()
函数在 ServiceNow 内的作用域应用程序内部不起作用。
给定格式为 YYYY-MM-DD 的日期,您可以使用 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);
通常建议避免使用内置解析器,但在这种情况下可能没问题。但是为了自信,手动解析字符串,一个库可以提供帮助,但它只需要一个 2 行函数。
如果您的日期不是按上述方式创建的并且未设置为午夜,您可以通过将日期设置为午夜、减去和四舍五入来获得日期之间的天数,例如
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));
Service Now 中最常用的 API 可用于计算持续时间的是 gs.DateDiff(date1, date2),但它在范围应用程序中不起作用。
SN 提供了它自己的 APIs,它可以使用 GlideDateTime API
在范围应用程序中获取持续时间如果您的字段是 date/time
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());
如果您想在业务规则中执行此操作,在作用域应用程序中,它可能如下所示(已测试在奥兰多版本中):
(function executeRule(current, previous /*null when async*/) {
var field_1 = new GlideDateTime(current.field_1);
var field_2 = new GlideDateTime(current.field_2);
current.field_duration = new GlideDuration(field_1.getNumericValue() - field_2.getNumericValue());
})(current, previous);