2008-09-10 2 views
12

Этот вопрос - другая сторона вопроса, задающая вопрос «How do I calculate relative time?».Как анализировать относительное время?

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

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

Пример входных данных:

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

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

+0

Для .net есть ответы в [Умный способ разобрать даты C#] (http://stackoverflow.com/a/25588407) – 2016-07-03 04:37:20

ответ

3

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

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

Вы можете сделать все это самостоятельно (с помощью the Dragon Book, например) или с помощью инструментов в действие, как показывают n в этом link.

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

+0

Отметьте nChronic (https://github.com/robertwilczynski/nChronic) для .NET. , – Larsenal 2012-02-02 21:51:30

7

Поиск в Google включает библиотеку parsedatetime (связанную с Chandler project), которая предназначена именно для этого. Это открытый исходный код (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#, вы можете написать что-то на основе алгоритмов, которые они используют ...

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

+0

Мне удалось использовать его с C#, и он работает очень хорошо. Если кто-то заинтересован, я могу загрузить его где-нибудь. – VitalyB 2011-12-20 06:27:41

0

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

Я наблюдал за информативное видео-презентацию недавно о том, как автор пошел о решении этой проблемы.

+0

Ссылка на видео будет замечательной. – Larsenal 2008-09-10 23:24:50

0

Это, вероятно, не все, что полезно, так как вы говорите C#, но так как никто никогда упомянул об этом еще можно попытаться взглянуть на прекрасную и совершенно безумным родной strtotime функции РНР

Смежные вопросы