Подтвердить что ты не робот

Как анализировать относительное время?

Этот вопрос - другая сторона вопроса, задающая вопрос: Как рассчитать относительное время?".

Учитывая некоторый вклад человека в относительное время, как вы можете его разобрать? По умолчанию вы будете отступать от DateTime.Now(), но могут быть необязательно смещены от другого DateTime.

(Предпочитают ответы на С#)

Пример ввода:

  • "через 20 минут
  • "5 часов назад"
  • "3h 2m"
  • "на следующей неделе"

Изменить: Предположим, что мы можем определить некоторые ограничения на ввод. Этот вид кода будет полезной вещью, которая должна быть доступна в Интернете.

4b9b3361

Ответ 1

Это построение DSL (для конкретного домена) для обработки даты. Я не знаю, кто-то сделал это для .NET, но построение DSL довольно просто:

  • Определите язык точно, какие формы ввода вы примете и что вы будете делать с двусмысленностями.
  • Построить грамматику для языка
  • Постройте конечный автомат, который анализирует ваш язык в действующем AST

Вы можете сделать все это самостоятельно (с помощью Книга Дракона, например) или с помощью инструментов для эффект, как показано в этой ссылке.

Просто размышляя о возможностях, у вас есть хороший шанс, с помощью хороших примеров пользовательского интерфейса, охватить более половины фактических данных, которые получит ваше приложение. Если вы намерены принять все, что может набрать человек, вы можете записать вход, определенный как неоднозначный, а затем добавить их в грамматику, когда они могут быть интерпретированы, поскольку есть вещи, которые будут по своей сути неоднозначными.

Ответ 2

В поиске Google появляется библиотека parsedatetime (связанная с проект Chandler), который предназначен именно для этого. Это открытый исходный код (Apache License) и написан на Python. Это кажется довольно сложным - с домашней страницы:

parsedatetime может анализировать, для например, следующее:

* Aug 25 5pm
* 5pm August 25
* next saturday
...
* tomorrow
* next thursday at 4pm
* at 4pm
* eod
* in 5 minutes
* 5 minutes from now
* 5 hours before now
* 2 days from tomorrow

Поскольку он реализован в чистом Python и не использует ничего интересного, есть хороший шанс, что он совместим с IronPython, так что вы может использовать его с .net. Если вы хотите специально решить С#, вы можете написать что-то на основе алгоритмов, которые они используют...

Он также поставляется с целым куском модульных тестов.

Ответ 4

Скорее всего, это не так полезно, поскольку вы говорите С#, но так как никто не упоминал об этом, вы можете попытаться взглянуть на php отлично и совершенно безумный родной strtotime

Ответ 5

Это: http://www.codeproject.com/KB/edit/dateparser.aspx Достаточно близко к тому, что вы пытаетесь выполнить. Не самое изящное решение, но, безусловно, может сэкономить вам некоторую работу.