Как разобрать относительное время? - PullRequest
12 голосов
/ 11 сентября 2008

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

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

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

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

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

Редактировать: Предположим, мы можем определить некоторые ограничения на входе. Такой код был бы полезен для публикации в Интернете.

Ответы [ 5 ]

7 голосов
/ 11 сентября 2008

Поиск 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. Если вы хотите конкретно решение на C #, вы можете написать что-нибудь на основе алгоритмов, которые они используют ...

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

3 голосов
/ 11 сентября 2008

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

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

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

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

0 голосов
/ 11 сентября 2008

Это, вероятно, не так уж и полезно, поскольку вы говорите на c #, но пока никто об этом не упомянул, вы можете попробовать взглянуть на превосходную и совершенно безумную нативную php strtotime function

0 голосов
/ 11 сентября 2008

Рубиновые люди пытались решить эту проблему с помощью синтаксического анализатора Chronic .

Недавно я посмотрел информативную видеопрезентацию о том, как автор решил эту проблему.

0 голосов
/ 11 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...