language agnostic - Cómo analizar el tiempo relativo?
language-agnostic parsing (5)
Esta pregunta es la otra cara de la pregunta que pregunta: " ¿Cómo calculo el tiempo relativo? ".
Dado el aporte humano durante un tiempo relativo, ¿cómo se puede analizar? De forma predeterminada, se compensaría desde DateTime.Now()
, pero podría compensarse opcionalmente desde otro DateTime
.
(Prefiero respuestas en C #)
Ejemplo de entrada:
- "en 20 minutos"
- "hace 5 horas"
- "3h 2m"
- "la próxima semana"
Editar: Supongamos que podemos definir algunos límites en la entrada. Este tipo de código sería útil para tener en la web.
Eso es construir un DSL (lenguaje específico del dominio) para el manejo de la fecha. No sé si alguien ha hecho uno para .NET pero la construcción de una DSL es bastante sencilla:
- Defina el idioma de forma precisa, qué formularios de entrada aceptará y qué hará con las ambigüedades
- Construye la gramática del idioma
- Construya la máquina de estado finito que analiza su lenguaje en un AST procesable
Puede hacer todo eso usted mismo (con la ayuda de Dragon Book , por ejemplo) o con la ayuda de herramientas para el efecto, como se muestra en este enlace .
Solo con pensar detenidamente en las posibilidades tendrá una buena oportunidad, con la ayuda de buenos ejemplos de interfaz de usuario, de cubrir más de la mitad de las entradas reales que recibirá su aplicación. Si intentas aceptar todo lo que un humano podría escribir, puedes registrar la entrada determinada como ambigua y luego agregarla a la gramática, siempre que puedan interpretarse, ya que hay cosas que serán inherentemente ambiguas.
Esto probablemente no sea tan útil ya que estás hablando c # pero como nadie lo mencionó aún, puedes intentar echarle un vistazo a la excelente y totalmente loca función de strtotime de php .
Esto: http://www.codeproject.com/KB/edit/dateparser.aspx Es bastante parecido a lo que está tratando de lograr. No es la solución más elegante, pero ciertamente podría ahorrarle algo de trabajo.
Los ruby han intentado abordar esto con un analizador llamado Chronic .
Vi una presentación informativa en video recientemente sobre cómo el autor resolvió este problema.
Una búsqueda en Google muestra la biblioteca parsedatetime (asociada al proyecto Chandler ), que está diseñada para hacer exactamente esto. Es de código abierto (licencia de Apache) y está escrito en Python. Parece ser bastante sofisticado, desde la página de inicio:
parsedatetime es capaz de 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, hay muchas posibilidades de que sea compatible con IronPython , por lo que podría usarlo con .net. Si desea específicamente una solución C #, puede escribir algo en función de los algoritmos que utilizan ...
También viene con un montón de pruebas unitarias.