2008-09-10 9 views
12

Esta pregunta es la otra cara de la pregunta, "How do I calculate relative time?".¿Cómo se analiza el tiempo relativo?

Dado el aporte humano durante un tiempo relativo, ¿cómo se puede analizar? De manera 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"
  • "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.

+0

Para .net hay respuestas en [Manera inteligente de analizar las fechas C#] (http://stackoverflow.com/a/25588407) –

Respuesta

3

Eso está construyendo un DSL (lenguaje específico de dominio) para el manejo de fechas. No sé si alguien ha hecho una para .NET, pero la construcción de una conexión DSL es bastante sencillo:

  1. definir el lenguaje, precisamente, lo que constituye la entrada va a aceptar y lo que va a hacer con ambigüedades
  2. la construcción de la gramática para el idioma
  3. Construye la máquina de estados finitos que analiza su idioma en un AST accionable

puede hacer todo lo que por sí mismo (con la ayuda de the Dragon Book, por ejemplo) o con la ayuda de herramientas para el efecto, como se muestra n en este link.

Solo con pensar mucho en las posibilidades, tiene una buena oportunidad, con la ayuda de buenos ejemplos de IU, 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.

+0

Consulte nChronic (https://github.com/robertwilczynski/nChronic) para .NET . – Larsenal

7

Una búsqueda de Google muestra la biblioteca parsedatetime (asociada con Chandler project), que está diseñada para hacer exactamente esto. Es de código abierto (licencia de Apache) y está escrito en Python. Parece ser bastante sofisticados - desde la página principal:

parsedatetime es capaz de analizar, por ejemplo, la 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 

Ya que está implementado en Python puro y no lo hace use cualquier cosa sofisticada, hay una buena probabilidad de que sea compatible con IronPython, por lo que podría usarla 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.

+0

Tuve éxito en usarlo desde C# y funciona bastante bien. Si alguien está interesado, puedo subirlo a alguna parte. – VitalyB

0

Esto es probable que no todo lo que útil, ya que estamos hablando C# pero como nadie lo ha mencionado todavía se puede tratar de echar un vistazo a excelente y totalmente loco strtotime función nativa de PHP

Cuestiones relacionadas