Функция Date Time в выполнении Dialogflow - PullRequest
0 голосов
/ 23 ноября 2018

Кто-нибудь может объяснить, что означают эти функции?

setDate = agent.parameters.date.split('T')[0];
setTime = agent.parameters.time.split('T')[1].split(':')[0];

Я выполняю бронирование для бронирования и хочу, чтобы Google Assistant распечатывал время входа пользователя в виде 12-часового формата.Прямо сейчас, когда я ввожу 16:00, он будет распечатан в 16 часов. Моя дата работает отлично, но время - нет.Я пробовал другие методы, но я не совсем понимаю, что означает «разделение».

например.Если я скажу "забронировать стол сегодня 16:30" , то Google ответит как "Вы забронировали номер в 2018-11-23 в 16:30". Но с кодами теперь он печатает "2018-11-23 в 16"

Это мой код:

function makeBooking(agent){

bookingDate= agent.parameters.date.split('T')[0];
bookingTime = agent.parameters.time.split('T')[1].split(':')[0];

agent.add(`You have booked on ${availDate} at ${availTime}.`);

}

// A helper function that receives Dialogflow's 'date' and 'time' parameters and creates a Date instance.

function convertParametersDate(date, time){
  var resultDate = new Date(Date.parse(date.split('T')[0]));
  return resultDate;
}

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Параметр @ sys.time в Dialogflow возвращает время в формате YYYY-MM-DDTHH:MM:SS+05:30, где + 05: 30 - это временной сдвиг Индии, и он будет варьироваться от страны к стране.

Когда вы говорите зарезервировать стол сегодня 16:30 , извлеченные параметры будут:

parameters ': {' time ':' 2018-11-23T16: 30: 00 + 05: 30 ',' date.original ':' today ',' time.original ':' 16:30 PM ', ' date ':' 2018-11-23T12: 00: 00 + 05: 30 '}

split() функция разделит строку на несколько частей в соответствии с указанным разделителем.

Ниже рис поможет вам понять, что происходит с вашей функцией .split('T')[1].split(':')[0]

enter image description here

Ниже код должен работать лучше в вашем случае:

from datetime import datetime
setTime = agent.parameters.time.split('T')[1].split('+')[0]
setTime = datetime.strptime(setTime, '%H:%m:%S')
setTime = setTime.strftime('%I:%M %p')

это даст 04: 30 PM

Надеюсь, это поможет.

0 голосов
/ 23 ноября 2018

Согласно документации dialoflow, sys.date возвращает строку даты в формате ISO 8601, например "2018-04-06T12: 00: 00-06: 00".

Итакесли agent.parameters.date является строкой в ​​том же формате, то в функции makeBooking предполагается, что значение равно «2018-11-23T16: 51: 42 + 05: 30"then:

function makeBooking(agent){ 
  // 2018-11-23
  var bookingDate= agent.parameters.date.split('T')[0];
  // 16
  var bookingTime = agent.parameters.time.split('T')[1].split(':')[0];
  // You have booked on 2018-11-23 at 16
  agent.add(`You have booked on ${availDate} at ${availTime}.`);
}

Если вы хотите, чтобы время было" 4:51 pm ", вместо этого вам нужно преобразовать 16:51 в соответствующий формат.Здесь уже много, много вопросов о переформатировании строк даты, в этом случае вы хотите, чтобы дата и время были отдельными строками, поэтому вы можете использовать что-то вроде следующего, которое возвращает массив даты и времени в качестве отдельных элементов:

// "2018-11-23T16:51:42+05:30"
function reformatDate(s) {
  // ["2018-11-23", "16:51:42+05:30"]
  var b = s.split('T');
  // ["16", "51"]
  var t = b[1].slice(0,5).split(':');  
  return [b[0], `${t[0]%12||12}:${t[1]} ${t[0]<12?'am':'pm'}`];
}

["2018-11-23T16:51:42+05:30",
 "2018-11-23T06:16:42+05:30",
 "2018-11-23T00:01:42+05:30",
 "2018-11-23T23:55:42+05:30"
].forEach(s => {
  var parts = reformatDate(s);
  console.log(`You have booked on ${parts[0]} at ${parts[1]}`);
});
...