Как работать со слотом AMAZON.DATE с помощью навыков работы с Node.js Amazon Alexa.

Если вы сталкивались с разработкой навыков Amazon Alexa с помощью Node.js, вы, вероятно, столкнулись бы с некоторыми проблемами при работе со слотом AMAZON.DATE.

Слот AMAZON.DATE можно использовать для множества различных задач: для получения события на определенную дату, для запроса календаря, для проверки бронирования и т. Д.

Представительство AMAZON.DATE

Слот AMAZON.DATE преобразует слова, представляющие даты, в формат даты. Ниже полный список конверсий:

  • «Прямо сейчас»: PRESENT_REF
  • «Сегодня»: 2017–11–24
  • «Завтра»: 2017–11–25
  • «Двадцать пятое ноября»: 2017–11–25
  • «В следующий понедельник»: 2017–11–30
  • «На этой неделе»: 2017-нед.48
  • «Следующая неделя»: 2017-W49
  • «В эти выходные»: 2017-W48-WE
  • «В этом месяце»: 2017–11 и 2019–11-XX гг.
  • «Следующий год»: 2018 и 2019-XX
  • «Это десятилетие»: 201X
  • «Следующей зимой»: 2018-WI
  • «Этим летом»: 2017-SU
  • «Этой осенью»: 2017-FA // as Fall
  • «Этой весной»: 2017-SP
  • «Этот квартал»: 2019-I квартал

Дополнительную информацию можно найти в Справочном руководстве по типам слотов Amazon.

AMAZON.DATE и объект Date JS

Предполагая, что вы обрабатываете даты с помощью объекта Javascript Date, первая проблема заключается в том, что вы не можете использовать значение AMAZON.date «как есть».

Например, следующий фрагмент кода возвращает «Invalid Date»:

new Date('2017-W50');
new Date('PRESENT_REF');

Другая проблема связана с такими представлениями, как «на этой неделе» или «на этих выходных», которые являются выражением определенной начальной и конечной точки. Чтобы прояснить этот случай, представьте, что вы хотите получить из базы данных список фильмов о кинотеатрах на эти выходные. Вероятно, вам следует запросить базу данных с помощью следующего псевдо-SQL-кода: `Выбрать фильмы между этой субботой и этим воскресеньем`.

Как справиться со всеми этими проблемами?
С помощью amazon-date-parser.

Парсер даты Amazon

Amazon-date-parser - полезный пакет npm (подробнее здесь). Он преобразует значение слота AMAZON.DATE в объект JS, состоящий из startDate и endDate, то есть:

var AmazonDateParser = require('amazon-date-parser');
var date = new AmazonDateParser('2017-W48');
console.log(date);
/* returns:
{ endDate: Sun Dec 03 2017 23:59:59 GMT+0000 (GMT),
  startDate: Mon Nov 27 2017 00:00:00 GMT+0000 (GMT) }
*/

Значения startDate и endDate являются объектами JS Date, и это отлично подходит для дальнейшего преобразования даты:

//following to the previous script below a conversion example
console.log(date.startDate.toLocaleDateString('en-US')); 
// returns “11/27/2017”
console.log(date.endDate.toLocaleDateString('en-GB')); 
// returns “12/3/2017”

Сезоны обработки

Библиотека также обрабатывает периоды времени года, но, поскольку концепция сезона может варьироваться в зависимости от контекста, на данный момент поддерживаются только метеорологические сезоны.
Итак, что такое сезон. Смотря как…

Метеорологические сезоны
С «метеорологической точки зрения» сезон основан на определенных погодных условиях, температуре или продолжительности дня. Итак, для жителей южного полушария, таких как Австралия или Бразилия, лето начинается 1 декабря.

Метеорологические сезоны в основном делятся на:

  • Весна - с 1 марта по 31 мая;
  • Лето - с 1 июня по 31 августа;
  • Осень / Осень - с 1 сентября по 30 ноября;
  • Зимний - с 1 декабря по 28 февраля (29 февраля в високосном году).

Астрономические сезоны

Астрономические сезоны основаны на датах равноденствий и солнцестояний.
В северном полушарии четыре астрономических сезона следующие:

  • Весна - от мартовского равноденствия до июньского солнцестояния;
  • Лето - июньское солнцестояние - сентябрьское равноденствие;
  • Осень / Осень - от сентябрьского равноденствия до декабрьского солнцестояния;
  • Зима - от декабрьского солнцестояния до мартовского равноденствия.

Если вы хотите работать с астрономическими сезонами, вам нужны даты-сезоны библиотеки npm.

Пример использования навыков Alexa

На этом этапе, вероятно, вы думаете о том, как использовать эту библиотеку в следующем навыке Alexa, я считаю, что следующий фрагмент кода даст вам представление:

var AmazonDateParser = require('amazon-date-parser');
//...
'searchIntent': function () {
    var slotValue = this.event.request.intent.slots.date.value;
    var dateRange = new AmazonDateParser(slotValue);
//...
/*
At this point you can use dateRange.startDate and dateRange.endDate to query an API or a database.
*/

Ниже приведен образец схемы намерений Alexa.

{
  "intents":  [
     { "intent": "AMAZON.HelpIntent", "slots": [] },
     { "intent": "AMAZON.StopIntent", "slots": [] },
     { "intent": "AMAZON.CancelIntent", "slots": [] },
     { "intent": "AMAZON.YesIntent", "slots": [] },
     { "intent": "AMAZON.NoIntent", "slots": [] },
     { "intent": "searchIntent", "slots": [
       { "name": "date", "type": "AMAZON.DATE" }
     ]}
  ]
}

И так, чего же ты ждешь? Добавьте библиотеку в свои зависимости и поделитесь отзывами!

npm install amazon-date-parser