Pregunta

Esta pregunta es la otra cara de la pregunta: "¿Cómo calculo el tiempo relativo?".

Dada alguna aportación humana durante un tiempo relativo, ¿cómo se puede analizar?Por defecto usted compensaría desde DateTime.Now(), pero opcionalmente podría compensarse con otro DateTime.

(Prefiero respuestas en C#)

Entrada de ejemplo:

  • "en 20 minutos"
  • "hace 5 horas"
  • "3h 2m"
  • "la próxima semana"

Editar: Supongamos que podemos definir algunos límites en la entrada.Sería útil tener este tipo de código en la web.

¿Fue útil?

Solución

Eso es crear un DSL (lenguaje específico de dominio) para el manejo de fechas.No sé si alguien ha hecho uno para .NET pero la construcción de un DSL es bastante sencilla:

  1. Defina con precisión el lenguaje, qué formularios de entrada aceptará y qué hará con las ambigüedades.
  2. Construir la gramática del idioma.
  3. Construya la máquina de estados finitos que analiza su lenguaje en un AST procesable

Puedes hacer todo eso por ti mismo (con la ayuda de el libro del dragón, por ejemplo) o con la ayuda de herramientas al efecto, como se muestra en este enlace.

Con solo pensar detenidamente en las posibilidades, tiene muchas posibilidades, con la ayuda de buenos ejemplos de UI, de cubrir más de la mitad de las entradas reales que recibirá su aplicación.Si su objetivo es aceptar todo lo que un humano podría escribir, puede registrar la entrada determinada como ambigua y luego agregarla a la gramática, siempre que pueda interpretarse, ya que hay cosas que serán inherentemente ambiguas.

Otros consejos

Una búsqueda en Google muestra el hora de fecha analizada biblioteca (asociada con la proyecto chandler), que está diseñado para hacer exactamente esto.Es de código abierto (licencia Apache) y está escrito en Python.Parece ser bastante sofisticado, desde la página de inicio:

ParsedateTime puede analizar, por ejemplo, lo siguiente:

* 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

Dado que está implementado en Python puro y no utiliza nada sofisticado, es muy probable que sea compatible con HierroPython, por lo que podrías usarlo con .net.Si desea específicamente una solución C#, puede escribir algo basado en los algoritmos que utilizan...

También viene con una gran cantidad de pruebas unitarias.

Probablemente esto no sea tan útil ya que estás hablando de C#, pero como nadie lo ha mencionado todavía, puedes intentar echarle un vistazo al excelente y completamente loco nativo de PHP. strtotime función

La gente de Ruby ha intentado solucionar esto con un analizador llamado Crónico.

Recientemente vi una presentación en video informativa sobre cómo el autor resolvió este problema.

Este: http://www.codeproject.com/KB/edit/dateparser.aspxEstá bastante cerca de lo que está tratando de lograr.No es la solución más elegante, pero ciertamente podría ahorrarle algo de trabajo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top