Pergunta

Esta questão é o outro lado da questão: "Como calculo o tempo relativo?".

Dada alguma contribuição humana por um tempo relativo, como você pode analisá-la?Por padrão, você compensaria de DateTime.Now(), mas poderia opcionalmente compensar de outro DateTime.

(Prefira respostas em C#)

Exemplo de entrada:

  • "em 20 minutos"
  • "5 horas atrás"
  • "3h 2m"
  • "semana que vem"

Editar: Suponhamos que possamos definir alguns limites na entrada.Esse tipo de código seria útil para se ter na web.

Foi útil?

Solução

Isso é construir uma DSL (linguagem específica de domínio) para tratamento de datas.Não sei se alguém fez isso para .NET, mas a construção de uma DSL é bastante simples:

  1. Defina a linguagem com precisão, quais formulários de entrada você aceitará e o que fará com as ambiguidades
  2. Construa a gramática do idioma
  3. Construa a máquina de estados finitos que analisa sua linguagem em um AST acionável

Você pode fazer tudo isso sozinho (com a ajuda de o Livro do Dragão, por exemplo) ou com a ajuda de ferramentas para o efeito, como mostrado neste link.

Apenas pensando bem sobre as possibilidades você terá uma boa chance, com a ajuda de bons exemplos de UI, de cobrir mais da metade das entradas reais que seu aplicativo receberá.Se você pretende aceitar tudo o que um ser humano poderia digitar, você pode registrar as entradas determinadas como ambíguas e depois adicioná-las à gramática, sempre que puderem ser interpretadas, pois há coisas que serão inerentemente ambíguas.

Outras dicas

Uma pesquisa no Google revela analisadodatahora biblioteca (associada ao Projeto Chandler), que foi projetado para fazer exatamente isso.É de código aberto (Licença Apache) e escrito em Python.Parece ser bastante sofisticado - na página inicial:

ParsedateTime é capaz de analisar, por exemplo, o seguinte:

* 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

Como é implementado em Python puro e não usa nada sofisticado, há uma boa chance de ser compatível com FerroPython, então você pode usá-lo com .net.Se você quiser especificamente uma solução C#, poderá escrever algo baseado nos algoritmos que eles usam...

Ele também vem com vários testes de unidade.

Provavelmente isso não é tão útil, já que você está falando de c#, mas como ninguém mencionou isso ainda, você pode tentar dar uma olhada no excelente e totalmente insano nativo do php strtotime função

O pessoal do Ruby tentou resolver isso com um analisador chamado Crônica.

Assisti recentemente a um vídeo informativo de apresentação sobre como o autor resolveu esse problema.

Esse: http://www.codeproject.com/KB/edit/dateparser.aspxEstá bastante próximo do que você está tentando realizar.Não é a solução mais elegante, mas certamente pode poupar algum trabalho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top