【问题标题】:Date Time function in Dialogflow fulfillmentDialogflow 实现中的日期时间函数
【发布时间】:2018-11-23 02:06:40
【问题描述】:

谁能解释一下这些函数是什么意思?

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

我正在进行预订预订,我希望 Google 助理以 12 小时格式打印出用户输入的时间。现在,当我在下午 4 点输入时,它会在 16 点打印出来。我的日期可以正常工作,但时间不行。我尝试过其他方法,但我不太明白“拆分”是什么意思。

例如。如果我说“book table today 4.30pm”,那么 google 会回复为 “您已于 2018 年 11 月 23 日下午 4:30 预订." 但是现在有了代码,它会打印出 " 2018-11-23 at 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;
}

【问题讨论】:

  • 如果你提供date和time的格式会更容易解释。 .split() 所做的是使用参数将字符串划分为数组元素以确定拆分位置。所以像"XXXX-XX-XXTYY:YY:YY:YY" 这样的字符串与.split('T') 分开会产生["XXXX-XX-XX", "YY:YY:YY:YY"] 的数组。
  • @RandyCasburn 嗨,我已经编辑了上面的代码,格式如上所示。
  • Date.parse 在new Date(Date.parse(date.split('T')[0])) 中是多余的,可以使用new Date(date.split('T')[0])。反正应该是new Date(date + 'T' + time)。
  • @RandyCasburn 谢谢,但它仍以 24 小时格式打印。
  • 在您提供agent.parameters.date 返回的值的格式之前,无法回答您的问题。该代码推断出 ISO 8601 扩展格式,但结果表明并非如此。

标签: javascript dialogflow-es actions-on-google


【解决方案1】:

根据 dialoflow 文档,sys.date 返回 ISO 8601 格式的日期字符串,例如“2018-04-06T12:00:00-06:00”。

所以如果agent.parameters.date是一个相同格式的字符串,那么在makeBooking函数中,假设值为“2018-11-23T16:51 :42+05:30" 然后:

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”,则需要将“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]}`);
});

【讨论】:

    【解决方案2】:

    但是对于希望通过 fullfilment 更改日期格式的人来说,这可能为时已晚:

    new Date('2020-05-01T12:00:00+05:30').toDateString()
    
    Output: "Fri May 01 2020"
    

    要查找小时和分钟,您可以使用getHours() 和getMinutes() 方法。

    更多信息您可以结帐:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

    【讨论】:

      【解决方案3】:

      Dialogflow 的@sys.time 参数以YYYY-MM-DDTHH:MM:SS+05:30 格式返回时间,其中+05:30 是印度的时间偏移量,它会因国家/地区而异。

      当您说book table today 4.30pm时,提取的参数将是:

      参数': {'时间': '2018-11-23T16:30:00+05:30', 'date.original': '今天​​','time.original':'4:30 pm','日期': '2018-11-23T12:00:00+05:30'}

      split() 函数将根据您提供的分隔符将字符串拆分为多个部分。

      下面的图片将帮助您了解您的功能.split('T')[1].split(':')[0]发生了什么

      下面的代码在你的情况下应该会更好:

      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

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 2021-10-21
        • 1970-01-01
        • 2018-12-19
        • 1970-01-01
        • 2012-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多