Alexa slot AMAZON.DATE 处理没有年份的日期
Alexa slot AMAZON.DATE handle dates without years
我正在构建 Alexa 技能并使用 AMAZON.DATE 插槽类型来获取日期。
我的问题是,当用户说出没有年份的日期时,Alexa 会处理它并 returns 带有未来日期的日期字符串。
示例 - 今天是 2017-09-20
,用户向 Alexa 询问日期 'Sixth June'
,Alexa returns 2018-06-06
.
我想使用最近的过去日期而不是最近的未来日期,以防用户未在话语中指定年份。如果用户指定年份,我不想更改日期年份。
我无法使用 Python 在 AWS Lambda 上处理此问题,因为 Alexa 会在 JSON 正文中发送完整的日期字符串,无论用户是否提供年份。
我不知道是否可以使用 Alexa 处理此类用户输入。关于 AMAZON.DATE 插槽或其他处理此类用户话语的方法,我可以做些什么吗?
你不能用内置的日期槽来做到这一点,
映射到特定日期(例如“今天”或“11 月 25 日”)的话语转换为完整日期:2015 年 11 月 25 日。 请注意,这默认为当前日期或之后的日期。
您可以尝试的一种逻辑是执行自定义逻辑。获取用户输入的今天日期和明年同一日期之间的差异。如果这些月份之间的差异大于 6 个月,那么最近的日期将是未来的日期。如果差异小于 6 个月,则过期。假设用户在 7 月 25 日(2017 年)输入,今天的日期是 2017 年 8 月 25 日。现在您可以将 7 月 25 日加 1 年,然后您将得到 2018 年 7 月 25 日。2018 年 7 月 25 日和 2017 年 8 月 25 日之间的差异大于 6 个月所以你想要的日期是过去的日期,即 2017 年 7 月 25 日,反之亦然。为了更准确,您可以以天而不是月来计算
将 Alexa 的插槽输入日期字符串转换为 js 日期对象后,(可能使用 amazon-date-parser)以下可以工作
if (dateobj > new Date()) {
var currentMonth = new Date().getMonth()
var dateMonth = dateobj.getMonth()
var offset = dateMonth > currentMonth ? 1 : 0 // if current month is to be set with past year use >=
dateobj.setFullYear(new Date().getFullYear() - offset);
}
我正在构建 Alexa 技能并使用 AMAZON.DATE 插槽类型来获取日期。
我的问题是,当用户说出没有年份的日期时,Alexa 会处理它并 returns 带有未来日期的日期字符串。
示例 - 今天是 2017-09-20
,用户向 Alexa 询问日期 'Sixth June'
,Alexa returns 2018-06-06
.
我想使用最近的过去日期而不是最近的未来日期,以防用户未在话语中指定年份。如果用户指定年份,我不想更改日期年份。
我无法使用 Python 在 AWS Lambda 上处理此问题,因为 Alexa 会在 JSON 正文中发送完整的日期字符串,无论用户是否提供年份。
我不知道是否可以使用 Alexa 处理此类用户输入。关于 AMAZON.DATE 插槽或其他处理此类用户话语的方法,我可以做些什么吗?
你不能用内置的日期槽来做到这一点,
映射到特定日期(例如“今天”或“11 月 25 日”)的话语转换为完整日期:2015 年 11 月 25 日。 请注意,这默认为当前日期或之后的日期。
您可以尝试的一种逻辑是执行自定义逻辑。获取用户输入的今天日期和明年同一日期之间的差异。如果这些月份之间的差异大于 6 个月,那么最近的日期将是未来的日期。如果差异小于 6 个月,则过期。假设用户在 7 月 25 日(2017 年)输入,今天的日期是 2017 年 8 月 25 日。现在您可以将 7 月 25 日加 1 年,然后您将得到 2018 年 7 月 25 日。2018 年 7 月 25 日和 2017 年 8 月 25 日之间的差异大于 6 个月所以你想要的日期是过去的日期,即 2017 年 7 月 25 日,反之亦然。为了更准确,您可以以天而不是月来计算
将 Alexa 的插槽输入日期字符串转换为 js 日期对象后,(可能使用 amazon-date-parser)以下可以工作
if (dateobj > new Date()) {
var currentMonth = new Date().getMonth()
var dateMonth = dateobj.getMonth()
var offset = dateMonth > currentMonth ? 1 : 0 // if current month is to be set with past year use >=
dateobj.setFullYear(new Date().getFullYear() - offset);
}