Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

Поиск в Google выдает следующее проанализированное время библиотека (связанная с Проект Чандлера), который предназначен именно для этого.Он с открытым исходным кодом (лицензия Apache) и написан на 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 и не использует ничего необычного, есть большая вероятность, что он совместим с Железный Питон, так что вы могли бы использовать его с .net.Если вам нужно конкретно решение на C #, вы могли бы написать что-то на основе используемых ими алгоритмов...

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

Вероятно, это не так уж и полезно, поскольку вы говорите на c #, но поскольку никто еще не упоминал об этом, вы можете попробовать взглянуть на превосходный и совершенно безумный родной язык php strtotime - время функция

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top