如何在IBM Watson Assistant中从2个日期时间计算持续时间

时间:2019-05-21 16:37:37

标签: datetime ibm-cloud ibm-watson watson-assistant

无法从IBM Watson Assistant中的另一个日期时间中减去一个日期时间来找到两个日期时间之间的持续时间。

我在Watson Assistant的对话框中定义了2个上下文变量来保存日期:

variable = $base_date  value = "2019-07-01 03:00:00"
variable = $current_date  value = "<? now() ?>"

这些值是字符串,我可以在响应中提供它们。但是,我无法弄清楚如何将它们转换为日期时间,因此我可以从$current_date中减去$base_date来响应duration = aa Days, bb Hours, cc Minutes, dd Seconds之类的持续时间。我不知道如何将它们转换为从1970年1月1日起的毫秒数,这样我就可以在两个日期之间进行数学运算了。

上下文变量:

$base_date     "2019-07-01 03:00:00"
$current_date  "<? now() ?>"

响应:

Base date = <? $base_date ?>
Current date = <? $current_date ?>

...上面的方法可以很好地向用户显示相关日期,如下所示:

Base date = 2019-07-01 03:00:00
Current date = 2019-05-21 12:24:26

但是,这不起作用...

Duration = <? $base_date - $current_date ?>

这是我收到的错误,显然是告诉我不能减去2个字符串。我只是不知道如何转换为我可以操纵的日期时间或数字。...

对话框节点错误

  

使用对话框节点ID [Welcome]的输出更新输出时出错。   节点输出为[{“ text”:{“ values”:[“基础日期= \ n当前日期= ...持续时间=”],“ selection_policy”:“顺序”}}}] SpEL评估   错误:表达式[$ base_date-$ current_date]转换为[   context ['base_date']-位置0的context ['current_date']]:   EL1030E:在以下对象之间不支持运算符“ SUBTRACT”   输入“字符串”和“字符串”

2 个答案:

答案 0 :(得分:0)

我会推荐IBM Watson Assistent documentation on working with date and time values,包括计算。表达式语言有几种添加或减去值的方法。还有一些示例,说明如何重新格式化日期/时间值以用作进一步计算的输入。

working with time spans上的部分可能是您要搜索的部分。您可以对 java.util.Date 使用操作。 That class has operations to turn the data string into a long with milliseconds since 1970

对于复杂的转换或计算,您可能希望将其委托给Cloud Functions操作。请参见making programmatic calls的本节。

答案 1 :(得分:0)

data_henrik建议将此逻辑委托给Cloud Functions操作或Watson Assistant之外的逻辑层中,这是一个合理的建议。您必须在Watson Assistant中非常努力地做到这一点,但是可以做到。

通过整数和子字符串,您可以获取各个日期部分。

  "context": {
    "base_year": "<? T(Integer).parseInt($base_date.substring(0,4)) ?>",
  }

您可以使用Java中的Date构造函数来最终获取毫秒值。我提供base_year作为简单示例。对于base_time,我添加了缩进以提高可读性。

  "context": {
    "base_year": "<? T(Integer).parseInt($base_date.substring(0,4)) ?>",
    "base_time": "<? new Date(
        T(Integer).parseInt($base_date.substring(0,4)),
        T(Integer).parseInt($base_date.substring(5,7)),
        T(Integer).parseInt($base_date.substring(8,10)),
        T(Integer).parseInt($base_date.substring(11,13)),
        0,0).getTime() ?>",
    "current_time": "<? new Date(2019,05,24,22,14,12).getTime() ?>"
  }

然后您可以输入以下文本:

Duration in days = <? ($base_time - $current_time)/(1000*60*60*24) ?>