Как рассчитать продолжительность времени из 2-х датчасов в IBM Watson Assistant - PullRequest
0 голосов
/ 21 мая 2019

Невозможно вычесть дату и время из другой даты и времени в IBM Watson Assistant, чтобы найти продолжительность между двумя датами и временем.

Я определил 2 переменные контекста в диалоге в Watson Assistant для хранения дат:

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. Я не могу понять, как преобразовать их в миллисекунды с 1 января 1970 года, чтобы потом можно было посчитать между двумя датами.

Переменные контекста:

$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 строки. Я просто не могу понять, как преобразовать дату или время в число, которым я могу манипулировать ....

Ошибка узла диалога

Ошибка при обновлении вывода с выводом идентификатора узла диалога [Welcome]. Вывод узла: [{"text": {"values": ["Base date = \ nCurrent date = ... Duration ="], "selection_policy": "sequential"}}] Оценка SpEL ошибка: выражение [$ base_date - $ current_date] преобразовано в [ context ['base_date'] - context ['current_date']] в позиции 0: EL1030E: Оператор SUBTRACT не поддерживается между объектами введите 'String' и 'String'

Ответы [ 2 ]

0 голосов
/ 25 мая 2019

data_henrik предлагает делегировать эту логику действию Cloud Functions или в логическом слое вне Watson Assistant, является разумным предложением. Вы должны действительно усердно работать, чтобы сделать это в Watson Assistant, но это можно сделать.

Через целое число и подстроку можно получить отдельные части даты.

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

Вы можете использовать конструктор Date из Java, чтобы в конечном итоге получить значение в миллисекундах. Я приведу 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) ?>
0 голосов
/ 21 мая 2019

Я бы порекомендовал документацию IBM Watson Assistant по работе со значениями даты и времени , включая вычисления.Язык выражений имеет несколько методов для добавления или вычитания значений.Есть также примеры того, как переформатировать значения даты / времени, которые будут использоваться в качестве входных данных для дальнейших вычислений.

Раздел о работе с интервалами времени может быть тем, что вы ищете.Вы можете использовать операции для java.util.Date . Этот класс имеет операции для преобразования строки данных в длинную с миллисекундами с 1970 года .

Для сложных преобразований или вычислений вы можете захотеть делегировать это действию Cloud Functions.См. Этот раздел по программным вызовам .

...