В шаблоне, который вы используете, может быть опция, но я не могу ее найти, поэтому вот что вам нужно знать о настройке часовых поясов в Lex.
Прежде всего, единственный способ изменить часовой пояс по умолчанию для восточной части США - это использовать PostContent API или PostText API . Они действительно должны иметь настройку часового пояса в консоли Lex, чтобы вы могли установить часовой пояс по умолчанию как минимум, но они этого не делают.
Правильный путь:
AWS SDK необходим для использования PostContent API или PostText API для передачи ввода пользователя вашему боту чата Lex. При передаче данных в Lex таким способом вы можете указать requestAttributes
для ввода пользователя, уникального идентификатора и атрибутов сеанса (необязательно). Вот пример того, как вы можете установить timezone
в requestAttributes
на Сингапурское время:
{
"inputText": "What the user said.",
"requestAttributes": {
"x-amz-lex:time-zone" : "Singapore"
},
"sessionAttributes": null
}
Обходной путь:
Если вы не можете использовать или не можете использовать PostContent или PostText, то вам нужно работать с тем, что у вас есть. Прямо сейчас, похоже, что вы используете только лямбда-функцию для выполнения, но вы также должны использовать ее для «инициализации и проверки».
![enter image description here](https://i.stack.imgur.com/ya7qp.png)
Это будет передавать запрос к вашей лямбда-функции каждый раз, когда Лекс обрабатывает ввод, и вы можете указать Лексу, как именно ответить. Это дает вам намного больший контроль над вашим чат-ботом.
Чтобы понять формат Запроса (иногда называемого «Событием») и как отформатировать Ответ в этой функции Lambda, вам нужно прочитать эти документы .
Теперь Lex обрабатывает дату и время из пользовательского ввода ... (В вашем примере пользователь говорит "сегодня") ... и Lex заполнит слоты даты или времени чем-то вроде (date) 2018-11-02
(время) 13:00
, которое будет соответствовать восточному стандартному времени (UTC-5). Но в Сингапуре UTC +8. Таким образом, вам нужно будет преобразовать эту дату и время в вашей функции Lambda и перезаписать временные интервалы на эквивалентное сингапурское время, а затем передать эти временные интервалы обратно в ответ Lambda на Lex.
Существует несколько способов сделать это преобразование в зависимости от того, находится ли ваша Lambda в Node.js или Python, и множество ответов и руководств по преобразованию часового пояса.
Пример:
Ввод пользователя: «Я хочу забронировать комнату для переговоров с 13:00 до 14:00 на сегодня»
Чтобы зафиксировать значения этого входа, ваше намерение должно быть настроено на что-то вроде:
3 слота: {date} {time_start} {time_end}
Намерение: «Я хочу забронировать комнату собрания с {time_start} до {time_end} на {date}» *
Затем Lex проанализирует вход и заполнит слоты (используя часовой пояс по умолчанию: Восток США). Затем Lex передаст запрос вашей лямбда-функции «инициализация и проверка». Запрос (или «событие») будет включать:
{
"currentIntent": {
"name": "BookRoom",
"slots": {
"date": "2018-11-05",
"time_start": "13:00",
"time_end": "14:00",
},
},
...
}
Затем в лямбда-функции вы можете принимать следующие значения (Node.js):
var date = event['currentIntent']['slots']['date'];
var time_start = event['currentIntent']['slots']['time_start'];
var time_end = event['currentIntent']['slots']['time_end'];
Теперь для вашей логики преобразования:
Поскольку в Сингапуре на 13 часов больше, чем в восточной части США, просто возьмите это время и прибавьте к нему 13 часов. Если при этом проходит полночь, то также увеличьте дату на 1 день.
Это будет работать для вводов "сегодня" , "завтра" , "следующий вторник" или даже "25 января 2035" , потому что Lex анализирует все эти данные одинаково и просто доставляет их в вашу Lambda по умолчанию по восточному времени США, отформатированному как (дата) yyyy-mm-dd
и (время) hh:mm
.
После того, как вы конвертируете их, просто установите эти слоты в качестве новой даты и времени, а затем передайте слоты обратно Лексу в вашем ответе. Затем Lex будет хранить значения слотов по сингапурскому времени.